2016-09-27 56 views
1

我想要一个字符串用作正则表达式字符串。
在下面的代码:
_pattern就像是abba一个模式,我想检查_string遵循_pattern(如catdogdogcat
生成正则表达式字符串用于re.match()

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>

+1

附注:'dict.has_key'已被弃用了很长时间。 'hm.has_key(x)'可以更改为'h in hm',它运行速度更快,并且与Python的其他方式保持一致。同样,'不是hm.has_key(x)'可以更好地表达为'x not in hm'。 – ShadowRanger

+0

@ShadowRanger我会记住这一点。谢谢! – lordzuko

回答

1

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

可以在.match使用

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

这样的:

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

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

编辑:

您也才能避免双重\\这样的: 进口品

_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) 
+0

这也是我猜到的。取代完美的作品,并服务于我的目的。你能告诉我有没有办法写这个,这样我就可以在构建** rxp **时避免'\\\\'? – lordzuko

+0

是的,也可以这样做,请参阅编辑的答案。 – anubhava

+1

这是我犯了错误的地方。刚刚阅读,因为我要在正则表达式中使用字符串,我不需要担心反斜杠。谢谢!! – lordzuko

0

你应该使用字符串格式化,而不是硬编码rxp到字符串:

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

我也试过,如果这是正确的'_string'应该是匹配正则表达式'rxp' ryt?但没有发生。 – lordzuko

+0

'print rxp'显示什么? –

+0

'(。+)(。+)\\ 2 \\ 1' – lordzuko