regex 使用具有大小写敏感和不敏感混合模式的regrex查找文本中使用的人称代词的数量

ggazkfy8  于 2023-05-19  发布在  其他
关注(0)|答案(4)|浏览(128)

我想用正则表达式计算一个句子中的人称代词的数量,如Iwemyoursus。我希望它忽略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”。我不知道该如何忽略这些案例。

zbdgwd5y

zbdgwd5y1#

您匹配US是因为您的正则表达式有一个us替代项,并且re.I标志启用了不区分大小写的搜索。
您可以在单词内部获得部分匹配,因为正则表达式是不感知上下文的,没有以任何方式“锚定”。如果需要匹配单词,请使用单词边界。您不需要将它们与每个备选项一起放置,您可以使用 grouping 构造并将\b仅放置在组的两端。
你可以用

pronounRegex = re.compile(r'\b(I|we|my|ours|(?-i:us))\b',re.I)
  • 详情 *:
  • \b-一个单词边界(在左边,可以是字符串的开始位置,也可以是一个非单词字符)
  • (-ID为1的捕获组的开始:
  • I|we|my|ours-Iwemyours字之一
  • |-或
  • (?-i:us)- inline modifier group 其中匹配区分大小写,并且仅匹配us(而不是US
  • )-组结束
  • \b-由于前一个字符是一个单词字符,下一个位置要么是字符串的结尾,要么后面有一个非单词字符。

参见Python demo

import re
pronounRegex = re.compile(r'\b(I|we|my|ours|(?-i:us))\b',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']

请参阅this regex demo(注意PCRE选项已被选中,因为在regex 101中Python选项有一个bug)。

g6baxovj

g6baxovj2#

为了防止re匹配单词thistweek,您可以使用单词边界。将\b添加到运算符|之间的每个正则表达式项的前面和后面
像这样

r'\bI\b|\bwe\b|\bmy\b|\bours\b|\bus\b'

现在,为了防止US的匹配,您需要显式地指定动词的可能形式。例如,代词we可以写成Wewe本身,但不能写成wE
所以,像这样重新构建正则表达式,

pronounRegex = re.compile(r'\bI\b|\bwe\b|\bWe\b|\bmy\b|\bMy\b|\bours\b|\bus\b')
pronounRegex.findall(' I me  you We and all of us make this team tweek, he is from US')

此外,请注意代词oursus没有以大写形式提供。因为这些代词永远不能出现在句子的开头(即 * 所有格形式 *)。

cs7cruho

cs7cruho3#

在运算符|之间的正则表达式项的前后添加单词边界\b

r'\bI\b|\bwe\b|\bmy\b|\bours\b|\bus\b'
2ul0zpep

2ul0zpep4#

若要排除小写的'i',可以使用以下代码段

pronounRegex = re.compile(r'\b((?-i:I)|we|my|ours|(?-i:us))\b', re.I)
pronouns = pronounRegex.findall(file_to_analyse)
print(pronouns)
pronoun_count = len(pronouns)
print(pronoun_count)

相关问题