我尝试在字符串中找到满足条件的所有子字符串。
假设我们有字符串:
s = 'some text 1a 2a 3 xx sometext 1b yyy some text 2b.'
我需要应用搜索模式{(一个(单词组),两个(另一组单词),三个(另一组单词)),单词}。前三个位置是可选的,但至少应该有一个位置。如果是这样,我需要在他们之后说一句话。 输出应该是:
2a 1a 3 xx
1b yyy
2b
我写了这个表达式:
find_it = re.compile(r"((?P<one>\b1a\s|\b1b\s)|" +
r"(?P<two>\b2a\s|\b2b\s)|" +
r"(?P<three>\b3\s|\b3b\s))+" +
r"(?P<word>\w+)?")
每组包含一组或不同的单词(不是1a,1b)。我不能把它们混合成一个组。如果组为空,则应为None
。显然结果是错误的。
find_it.findall(s)
> 2a 1a 2a 3 xx
> 1b 1b yyy
我很感谢你的帮助!
答案 0 :(得分:0)
您可以使用以下正则表达式:
>>> reg=re.compile('((?:(?:[12][ab]|3b?)\s?)+(?:\w+|\.))')
>>> reg.findall(s)
['1a 2a 3 xx', '1b yyy', '2b.']
这里我只使用字符类和修饰符?
来简化你的正则表达式。以下正则表达式包含2部分:
[12][ab]|3b?
[12][ab]
将匹配1a
,1b
,2a
,2b
和3b?
将匹配3b
和{{1} }}
如果您不想在3
末尾使用点,则可以使用比前面的正则表达式更通用的positive look ahead使用以下正则表达式(因为使2b
可选是在第一组中不是一个好主意):
\s
此外,如果您的数字和示例子字符串只是实例,则可以使用>>> reg=re.compile('((?:(?:[12][ab]|3b?)\s)+\w+|(?:(?:[12][ab]|3b?))+(?=\.|$))')
>>> reg.findall(s)
['1a 2a 3 xx', '1b yyy', '2b']
作为一般正则表达式:
[0-9][a-z]