【问题标题】:How do i write a regular expression for the following pattern in python?如何在 python 中为以下模式编写正则表达式?
【发布时间】:2010-10-11 11:55:44
【问题描述】:

如何在 python 中使用正则表达式查找以下模式?两种情况

在“=”符号后寻找str2

  • 案例一:str1=str2
  • 案例2:str1 = str2

请注意,“=”符号的两侧之间可以有一个空格或没有

我的也是这样,但只适用于其中一种情况!

m=re.search('(?<=str\s\=\s)\w+','str = str2')

返回 str2

救命!

加特

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    只需使用拆分功能

    【讨论】:

      【解决方案2】:

      相关想法:我发现在尝试找出正确模式时使用图形正则表达式工具很有帮助:http://kodos.sf.net

      【讨论】:

        【解决方案3】:

        两种情况:

        • (情况 1)如果 '=' 之前有一个空格,那么 必须 在 '=' 之后也有一个空格

          m=re.search(r'(?<=\S)(?:\s=\s|=)(\w+)','str = str2')
          print m.group(1)
          
        • (情况2)否则,

          m=re.search(r'(?<=\S)\s?=\s?(\w+)','str = str2')
          print m.group(1)
          

        在第一种情况下,您也可以对第二个空格使用“(?P=...”构造或不使用它,但它仍然不适用于肯定的后向断言,因为它不是一个恒定长度的子表达式。

        【讨论】:

          【解决方案4】:

          如果你确实只有这么简单的字符串来解析你不需要正则表达式。您可以在= 上进行分区并剥离(甚至是lstrip)结果元组的最后一个元素:

          >>> case = 'str = str2'
          >>> case.partition('=')[2].lstrip()
          'str2'
          

          它会比正则表达式快得多。并且只是为了展示我做了一个简单的测试有多快:

          >>> timeit.timeit("'str1 = str2 '.partition('=')[2].strip()")
          0.49051564213846177
          >>> timeit.timeit("'str1 = str2 '.split('=')[1].strip()")
          0.97673281637025866
          >>> timeit.timeit('import re')
          0.65663786250422618
          

          【讨论】:

          • 你应该使用 strip() 而不是 lstrip()。因为在这种情况下会失败 = "str = str2 "
          • 我帖子的文字清楚地写着strip (or even lstrip)。我相信所有感兴趣的各方都能够修改我的示例以满足他们的需求。
          【解决方案5】:

          如果您的数据是固定的,那么您可以在不使用正则表达式的情况下执行此操作。只需将其拆分为'='。 例如:

          >>> case1 = "str1=str2"
          >>> case2 = "str1 = str2"
          
          >>> str2 = case1.split('=')[1].strip()
          >>> str2 = case2.split('=')[1].strip()
          

          YOURCASE.split('=')[1].strip() 语句适用于任何情况。

          【讨论】:

            【解决方案6】:

            如果您只想处理上述两种情况,我认为正则表达式是矫枉过正的。这就是我要做的-

            >>> case1 = "str1=str2"
            >>> case2 = "str1 = str2"
            >>> case2.split()
            ['str1', '=', 'str2']
            >>> ''.join(case2.split())
            'str1=str2'
            >>> case1[5:]
            'str2'
            >>> ''.join(case2.split())[5:]
            'str2'
            >>> 
            

            假设

            我假设您正在寻找特定的标记“str1”。我还假设 str1 可以分配不同的值。类似于配置文件中的内容 => propertyName = value。

            这只是我的意见。

            我知道其他方式也是可能的! SilentGhost 提供了一个不错(更好!)的替代方案。

            希望这会有所帮助。

            【讨论】:

              【解决方案7】:
              re.search(r'=\s*(.*)', 'str = str2').group(1)
              

              或者如果你只想要一个词:

              re.search(r'=\s*(\w+)', 'str = str2').group(1)
              

              扩展到特定的初始字符串:

              re.search(r'\bstr\s*=\s*(\w+)', 'str=str2').group(1)
              

              \b = 单词边界,所以不会匹配"somestr=foo"

              一次遍历所有选项会更快,而不是一次搜索单个选项:

              option_str = "a=b, c=d, g=h"
              options = dict(re.findall(r'(\w+)\s*=\s*(\w+)', option_str))
              options['c']  # -> 'd'
              

              【讨论】:

              • 这里您假设我们只有带有“=”符号的“字符串”,但可以有许多具有相同模式的“字符串”,即 a=b、c=d、g=h、这就是为什么我们强调正则表达式 ..Gath 上的 (?
              • 在你写作时修复:)
              【解决方案8】:

              扩展@batbrat 的答案和其他建议,您可以使用re.split() 分隔输入字符串。该模式可以使用\s(空格)或显式空格。

              >>> import re
              >>> c1="str1=str2"
              >>> c2="str1 = str2"
              >>> re.split(' ?= ?',c1)
              ['str1', 'str2']
              >>> re.split(' ?= ?',c2)
              ['str1', 'str2']
              >>> re.split(r'\s?=\s?',c1)
              ['str1', 'str2']
              >>> re.split(r'\s?=\s?',c2)
              ['str1', 'str2']
              >>> 
              

              【讨论】:

                猜你喜欢
                • 2021-09-21
                • 1970-01-01
                • 2020-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多