繁体   English   中英

生成要在 re.match() 中使用的正则表达式字符串

[英]Generating regex string to be used in re.match()

我正在尝试将字符串用作正则表达式字符串。
在以下代码中:
_pattern是一种类似于abba的模式,我正在尝试检查_string遵循_pattern (例如catdogdogcat

以下代码中的rxp是我试图创建以匹配_string的正则表达式(例如,对于上面的示例,它将是(.+)(.+)\\\\2\\\\1 )。 正在成功生成。 但是re.match()正在返回None

我想了解为什么它不起作用以及如何纠正它?

import re

_pattern = "abba" #raw_input().strip()
_string = "catdogdogcat" #raw_input().strip()
hm = {}
rxp = ""
c = 1
for x in _pattern:
    if hm.has_key(x):
        rxp += hm[x]
        continue
    else:
        rxp += "(.+)"
        hm[x]="\\\\"+str(c)
        c+=1

print rxp
#print re.match(rxp,_string) -> (Tried)  Not working
#print re.match(r'rxp', _string) -> (Tried) Not working

print re.match(r'%s' %rxp, _string) # (Tried) Not working 

输出
(.+)(.+)\\\\2\\\\1 None

预期产出
(.+)(.+)\\\\2\\\\1 <_sre.SRE_Match object at 0x000000000278FE88>

问题是您的正则表达式字符串变量有双\\\\而不是一个。

您可以使用

rxp.replace("\\\\", "\\")

.match是这样的:

>>> print re.match(rxp.replace("\\\\", "\\"), _string)
<_sre.SRE_Match object at 0x10bf87c68>

>>> print re.match(rxp.replace("\\\\", "\\"), _string).groups()
('cat', 'dog')

编辑:

您还可以避免像这样获得双\\\\ :import re

_pattern = "abba" #raw_input().strip()
_string = "catdogdogcat" #raw_input().strip()
hm = {}
rxp = ""
c = 1
for x in _pattern:
    if x in hm:
        rxp += hm[x]
        continue
    else:
        rxp += "(.+)"
        hm[x]="\\" + str(c)
        c+=1

print rxp
print re.match(rxp,_string)

您应该使用字符串格式,而不是将rxp硬编码到字符串中:

print re.match(r'%s'%rxp, _string)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM