从列表中匹配多个字符串匹配并为每个匹配创建一个新行
其中一个建议的解决方案按预期工作,但我想知道是否可以进行一些轻微的调整,以实现以下结果。保持与上面链接的第一个问题相同的条件,如果我想匹配list_3中的元素,而不管它在文本中的位置,新的正则表达式模式会是什么样子?(记住,来自列表_1和列表_2的元素将始终保持连续)。
举例说明:
list_1 = ['chest', 'test', 'west', 'nest']
list_2 = ['mike', 'bike', 'like', 'pike']
list_3 = ['hay', 'day', 'may', 'say']
text = 'zzz zzz chest bike zz zz day zzz'
新的正则表达式应该匹配chest、bike和day。在最初的问题中,胸部自行车和白天是连续的。在这里,他们仍然是,但有额外的文本之间的前两个比赛(胸部和自行车)和最后一场比赛(一天)。
最后,
最后,如果第一个列表(list_1)中的一个元素已经被匹配,我想跳过同一个单词的任何其他匹配。
举例说明:
text = 'zzz zz west like say zz zzz west bike zzz lay zzz zz zz nest mike zzz'
这将匹配west,比如说和nest,mike,因为west在文本中出现不止一次,而nest只出现一次。
文本仍将采用数据框格式,输出也应该采用该格式。
我现在使用的正则表达式如下:
pattern = r'\b' + r'(?:\b\s+'.join(fr"(?P<match_{i+1}>{'|'.join(w)})" for i, w in enumerate(word_list)) + r'\b' + ''.join(')?' for _ in range(1, len(word_list)))
谢谢你,谢谢
1条答案
按热度按时间q1qsirdb1#
您需要对正则表达式进行重大更改以满足新条件。首先,您需要将第三组设置为可选的,而不管第二组是否存在。其次,要处理像
zzz zz west like zz zzz nest bike zz say zzz
这样的字符串,你需要确保在搜索可选的第三个单词时,不要超出第一个单词(这样字符串将匹配west, like
和nest, bike, say
,而不是west, like, say
)。你可以用一个温和的贪婪令牌来做到这一点。对于给定的示例数据,正则表达式(为了可读性,使用了换行符)应该是:regex101上的正则表达式演示
你可以使用以下代码构建正则表达式:
然后,您可以将其应用于您的框架,如上一个问题中所述:
使用此示例输入数据:
这给出:
然后,您可以根据
text
和match_1
删除重复项:这给了你想要的结果: