如何从正则表达式中的字符串中找到不在单词边界的短语?

时间:2018-01-25 23:10:35

标签: python regex

好的,这可能只是谷歌搜索错误或没有正确阅读文档,但我无法找到任何相关内容。

说我有:

sample_str = "rose aaron robert moro"
pat = 'ro'

我想找到所有单词的实例(最好使用re.search()),这些单词的结尾或开始在' ro'中。也就是说,我想要一个或多个角色在' ro'之前和之后。所以我想要' aaron'匹配,但不匹配sample_str中的任何其他单词。

我该怎么做?我尝试了很多东西,包括' + ro +',但它给了我一个错误。我不是Python的新手但是在使用正则表达式方面遇到了一些麻烦,所以如果有人能解释那就太棒了。

由于

3 个答案:

答案 0 :(得分:6)

我相信你可以使用负面的前瞻/后视。

\b(?!ro)\w+(?<!ro)\b

应用于rose aaron robert moro时,仅匹配aaron

解释

\b =字边界
(?!ro) =后面没有ro \w+ =一个或多个单词字符
(?<!ro)\b =另一个字边界,前面没有ro

工作示例

https://regex101.com/r/WcSlsx/2/

答案 1 :(得分:2)

这个问题很简单,可以使用str方法。对于非正则表达式方法:

[x for x in sample_str.split() if (not x.startswith(pat)) and (not x.endswith(pat))]
# ['aaron']

注意:这将包括任何字符串,该字符串不以该模式开头或结尾。如果您希望扩展条件以包含包含该模式的单词,请尝试以下操作:

sample_str = "rose aaron robert moro nopattern"
pat = "ro"

[x for x in sample_str.split() if (not x.startswith(pat)) and (not x.endswith(pat)) and (pat in x)]
# ['aaron']

答案 2 :(得分:1)

我相信 hoipolloi 使用前瞻/后视来获得最佳答案。虽然,我花了相当多的时间试图弄清楚如何在不使用扩展正则表达式的情况下完成这个特定情况,但是我会很失望不分享它。这是我提出的模式。

r'(?:\b)((?:[^r\s]|(r[^o\s]))\S*(?:([^r\s]o)|[^o\s])|\w|(?:[^r]\s\w)|(?:\w[^o\s]))(?:\b)'

然后,您可以使用re.findall查找模式的所有出现。

import re

sample_str = "rose aaron robert moro"
pattern = r'(?:\b)((?:[^r\s]|(r[^o\s]))\S*(?:([^r\s]o)|[^o\s])|\w|(?:[^r]\s\w)|(?:\w[^o\s]))(?:\b)'
matchs = re.findall(pattern, sample_str)

这太复杂了,不可能概括和非常难看。但是,嘿,这很有趣。