gpt4 book ai didi

python - 正则表达式:如何使用正则表达式在可选捕获组之后捕获组?

转载 作者:太空狗 更新时间:2023-10-30 01:22:39 24 4
gpt4 key购买 nike

假设我有以下字符串:

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,s3s6 是可以的。

需要进行一些修改才能产生所需的输出:如果 M 存在,则获取它;如果括号存在,则获取括号的内容。

最佳答案

看来你需要使用非贪婪运算符:

^.-(F)([EF]*)(E+)[^FEM]??(M*)(\\(.*\\))?.*?$

请注意,在最后一个.* 的最后我添加了一个?。我还更改了 [^FEM]?[^FEM]??

在你的第一个样本中,问题是最后一个 .* 正在吃掉这个:-) 而你的 [^FEM]? 正在吃掉这个:( ... 因此没有为 (\\(.*\\))?

留下任何东西

(我还删除了单个字母周围的一些方括号,但这更多是为了让正则表达式更短)

使用这个正则表达式,我得到以下结果:

--FE(-)---    ->     'F'    ''     'E'    ''     '(-)'
--FEM(-)--- -> 'F' '' 'E' 'M' '(-)'
--FEE(--)- -> 'F' 'E' 'E' '' '(--)'

顺便说一句:我也会删除 (\\(.*\\))? 末尾的 ? 因为即使你不把它放在那里,与该部分不匹配的字符串将被以下 .*?.

使用

关于python - 正则表达式:如何使用正则表达式在可选捕获组之后捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com