【发布时间】:2013-11-28 15:18:52
【问题描述】:
假设我有以下字符串:
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,如果存在括号则获取括号的内容。
【问题讨论】: