我如何在python中为以下模式编写正则表达式?

时间:2009-03-05 11:50:51

标签: python regex string

如何在python中使用正则表达式查找以下模式?对于这两个案例

在“=”符号后面寻找str2

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

请注意“=”符号两边之间可以有空格或

我是这样的,但仅适用于其中一个案例!

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

返回str2

帮助!

加特

8 个答案:

答案 0 :(得分:8)

如果你确实只有这样简单的字符串来解析你就不需要正则表达式。你可以在=上进行分区并剥离(甚至是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

答案 1 :(得分:3)

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'

答案 2 :(得分:1)

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

>>> case1 = "str1=str2"
>>> case2 = "str1 = str2"

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

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

答案 3 :(得分:1)

只需使用拆分功能

答案 4 :(得分:0)

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

>>> 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可以分配不同的值。像你在配置文件中拥有的东西=&gt; propertyName = value。

这只是我的意见。

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

希望这有帮助。

答案 5 :(得分:0)

扩展@ 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']
>>> 

答案 6 :(得分:0)

两种情况:

  • (案例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 = ...”构造用于第二个空格或缺少它,但它仍然不适用于正向后观断言,因为它不是一个恒定长度的子表达式。

答案 7 :(得分:0)

相关的想法:我发现使用图形正则表达式工具有助于找出正确的模式:http://kodos.sf.net