我想用正则表达式计算一个句子中的人称代词的数量,如I
,we
,my
,ours
和us
。我希望它忽略US
,因为它可能是一个国家的名称。
代码如下
import re
pronounRegex = re.compile(r'I|we|my|ours|us',re.I)
pronouns = pronounRegex.findall(' I me you We and all of us make this team tweek, he is from US')
print(pronouns)
哪个打印
['I', 'We', 'us', 'i', 'we', 'i', 'US']
它从“this”中阅读“i”,从“tweek”中读出“we”。我不知道该如何忽略这些案例。
4条答案
按热度按时间zbdgwd5y1#
您匹配
US
是因为您的正则表达式有一个us
替代项,并且re.I
标志启用了不区分大小写的搜索。您可以在单词内部获得部分匹配,因为正则表达式是不感知上下文的,没有以任何方式“锚定”。如果需要匹配单词,请使用单词边界。您不需要将它们与每个备选项一起放置,您可以使用 grouping 构造并将
\b
仅放置在组的两端。你可以用
\b
-一个单词边界(在左边,可以是字符串的开始位置,也可以是一个非单词字符)(
-ID为1的捕获组的开始:I|we|my|ours
-I
、we
、my
、ours
字之一|
-或(?-i:us)
- inline modifier group 其中匹配区分大小写,并且仅匹配us
(而不是US
))
-组结束\b
-由于前一个字符是一个单词字符,下一个位置要么是字符串的结尾,要么后面有一个非单词字符。参见Python demo:
请参阅this regex demo(注意PCRE选项已被选中,因为在regex 101中Python选项有一个bug)。
g6baxovj2#
为了防止
re
匹配单词this
,tweek
,您可以使用单词边界。将\b
添加到运算符|
之间的每个正则表达式项的前面和后面像这样
现在,为了防止
US
的匹配,您需要显式地指定动词的可能形式。例如,代词we
可以写成We
或we
本身,但不能写成wE
。所以,像这样重新构建正则表达式,
此外,请注意代词
ours
和us
没有以大写形式提供。因为这些代词永远不能出现在句子的开头(即 * 所有格形式 *)。cs7cruho3#
在运算符
|
之间的正则表达式项的前后添加单词边界\b
2ul0zpep4#
若要排除小写的'i',可以使用以下代码段