在接下来的几天里,我将有很多关于正则表达式的问题。在过去5天里给自己的10个挑战中,我设法解决了6个。

我希望以下内容不是简单而令人尴尬的,但是我试图使用re.findall返回两个条件的结果,即使集合1的条件可能已经部分满足了。

示例(问题):

>>> str = 'ab1cd2efg1hij2k'
>>> re.findall('ab1cd|ab', str)
['ab1cd']
>>> re.findall('ab|ab1cd', str)
['ab']


因此请注意,取决于OR语句中的第一个来确定数组的单个元素是什么。我想要的是能够同时返回2个元素的数组,最好不返回一个元组。我对正则表达式ANDing所做的阅读集中在使正则表达式匹配2个不同的字符串,而不是返回可能互相部分满足的多个结果。以下是我想要的。

所需输出:

>>> str = 'ab1cd2efg1hij2k'
>>> re.findall('{SOMETHING_THAT_RETURNS_BOTH}', str)
['ab', 'ab1cd']


我得到的最接近的是:

>>> re.findall('ab|[\S]+?(?=2e)', str)
['ab', '1cd']
>>> re.findall('ab|[\S]+(?=2e)', str)
['ab', '1cd']


但是第二个捕获组将忽略ab。正则表达式中是否有指令说要从头开始重启? (?:^)的作用似乎与^相同,并且到目前为止,以多种方式使用它没有帮助。请注意,我不想使用正则表达式IF语句,也不想测试之前的组是否匹配,因为我还没有准备好为那些尚不了解的事物建立更坚实的基础之前就学习那些方法。

非常感谢。

最佳答案

如果您可以放宽元组要求,则由于需要捕获重叠的文本,因此需要在正则表达式后加上2个独立的先行符号:

>>> print re.search(r'(?=(ab1cd))(?=(ab))', str).groups()
('ab1cd', 'ab')


两个先行者都有一个捕获组,因此为我们提供了所需的输出。

您也可以使用findall

>>> print re.findall(r'(?=(ab1cd))(?=(ab))', str)[0]
('ab1cd', 'ab')

关于python - 当2个条件集部分满足另一个条件而没有IF语句或测试组且不作为结果时,Python Regex返回两个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44116258/

10-14 20:05
查看更多