Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从正则表达式中的字符串中查找不在单词边界的短语?_Python_Regex - Fatal编程技术网

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

Python 如何从正则表达式中的字符串中查找不在单词边界的短语?,python,regex,Python,Regex,好吧,这可能只是谷歌搜索错误或者没有正确阅读文档,但我找不到任何关于这方面的信息 假设我有: sample_str = "rose aaron robert moro" pat = 'ro' 我想查找所有不以“ro”结尾或开头的单词实例(最好使用re.search())。也就是说,我希望一个或多个字符在“ro”之前和之后。所以我想让‘亚伦’匹配,但不匹配样本中的任何其他单词 我该怎么做?我尝试了很多方法,包括“+ro+”,但它给了我一个错误。我不是Python新手,但在正则表达式方面有一些问题

好吧,这可能只是谷歌搜索错误或者没有正确阅读文档,但我找不到任何关于这方面的信息

假设我有:

sample_str = "rose aaron robert moro"
pat = 'ro'
我想查找所有不以“ro”结尾或开头的单词实例(最好使用re.search())。也就是说,我希望一个或多个字符在“ro”之前和之后。所以我想让‘亚伦’匹配,但不匹配样本中的任何其他单词

我该怎么做?我尝试了很多方法,包括“+ro+”,但它给了我一个错误。我不是Python新手,但在正则表达式方面有一些问题,所以如果有人能解释一下,那就太好了


谢谢

我相信你可以用消极的向前看/向后看来解决这个问题

\b(?!ro)\w+(?<!ro)\b
\b(?!ro)\w+(?
当应用于
rose aaron robert moro
时,将只匹配
aaron

解释
\b
=单词边界
(?!ro)
=后面不跟
ro

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

工作示例

我相信hoipolloi使用“向前看/向后看”是最好的答案。尽管我花了大量时间试图找出如何在不使用扩展regexp的情况下处理这个特定案例,但如果不与大家分享,我会感到失望。下面是我提出的模式

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)

这太复杂了,不可能一概而论,而且非常难看。但是,这很有趣。

这个问题非常简单,可以使用
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']

是否需要正则表达式?str
方法如何?我认为这是最简单和最好的答案。谢谢。而且,“\b”表示单词边界?您可以使用它们来标记单词的开头和结尾?