假设我有以下字符串:
s1=u'--FE(-)---' s2=u'--FEM(-)---' s3=u'--FEE(--)-'
我想匹配F,E,E,M和不同组中括号的内容.
我试过以下正则表达式:
u'^.-([F])([EF]*)([E]+)[^FEM]?(M*)?(\\(.*\\))?.*$'
此表达式为不同的字符串提供以下组和跨度:
s1 -> 'F',(2,3) , '',(3,3) , 'E',(3,4) , '',(5,5) , None,(-1,-1) s2 -> 'F',(2,3) , '',(3,3) , 'E',(3,4) , 'M',(4,5) , (-),(5,8) s3 -> 'F',(2,3) , 'E',(3,4) , 'E',(4,5) , '',(6,6) , None,(-1,-1)
对于s2,我得到了想要的行为,括号内容的匹配,但对于s1和s3,我没有.
如何创建一个与括号内容匹配的正则表达式,即使我没有与包含'M'的组的正确匹配?
编辑:
DWilches的答案使用正则表达式解决了初始问题
'^.-(F)([EF]*)(E+)[^FEM]??(M*)(\(.*\)).*?$'
但是,括号组也是可选的.以下简短的python脚本澄清了问题:
s1=u'--FE(-)---' s2=u'--FEM(-)--' s3=u'--FEE(--)-' s4=u'--FEE-M(---)--' s5=u'--FE-M-(-)-' s6=u'--FEM--' s7=u'--FE-M--' ll=[s1,s2,s3,s4,s5,s6,s7] import re rr1=re.compile(u'^.-(F)([EF]*)(E+)[^FEM]??(M*)[^FEM]??(\(.*\)).*?$') rr2=re.compile(u'^.-(F)([EF]*)(E+)[^FEM]??(M*)[^FEM]??(\(.*\))?.*?$') for s in ll: b=rr1.search(s) print s if b: print " '%s' '%s' '%s' '%s' '%s' " % (b.group(1), b.group(2), b.group(3), b.group(4), b.group(5)) else: print 'No match' print '######'
对于rr1
,输出是:
--FE(-)--- 'F' '' 'E' '' '(-)' ###### --FEM(-)-- 'F' '' 'E' 'M' '(-)' ###### --FEE(--)- 'F' 'E' 'E' '' '(--)' ###### --FEE-M(---)-- 'F' 'E' 'E' 'M' '(---)' ###### --FE-M-(-)- 'F' '' 'E' 'M' '(-)' ###### --FEM-- No match ###### --FE-M-- No match ######
对于前5个字符串是可以的,但不是最后两个字符串,因为它需要括号.
的rr2
,但是,添加?
到(\(.*\))
,产生以下输出:
--FE(-)--- 'F' '' 'E' '' '(-)' ###### --FEM(-)-- 'F' '' 'E' 'M' '(-)' ###### --FEE(--)- 'F' 'E' 'E' '' '(--)' ###### --FEE-M(---)-- 'F' 'E' 'E' '' 'None' ###### --FE-M-(-)- 'F' '' 'E' '' 'None' ###### --FEM-- 'F' '' 'E' 'M' 'None' ###### --FE-M-- 'F' '' 'E' '' 'None' ######
这对于s1,s2,s3
和s6
.
需要进行一些修改以产生所需的输出:M
如果存在括号,则获取它是否存在以及括号的内容.