- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下字符串:
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
存在,则获取它;如果括号存在,则获取括号的内容。
最佳答案
看来你需要使用非贪婪运算符:
^.-(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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!