查找至少包含一个组的所有子字符串

时间:2015-07-20 19:28:57

标签: regex python-2.7

我尝试在字符串中找到满足条件的所有子字符串。

假设我们有字符串:

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

我很感谢你的帮助!

1 个答案:

答案 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]将匹配1a1b2a2b3b?将匹配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]