【问题标题】:Regular expression to extract one word before a given word from a word list in Python正则表达式从Python中的单词列表中提取给定单词之前的一个单词
【发布时间】:2021-04-22 06:43:59
【问题描述】:

我想为这个问题提取一个词——谁吃了苹果。就像字符串是“Ujjwal ate the apple”一样。所以它应该使用正则表达式提取单词 'Ujjwal',在单词 ate 之前的一个单词。任何人都可以帮助我使用正则表达式吗?在python中。

实际上,我有一个列表,其中包含“吃”、“吃”、“吃”之类的词,就像“Ujjwal 吃过苹果”一样。这里也应该提取 Ujjwal。如何检查列表中的单词而不仅仅是“吃”本身?

【问题讨论】:

  • 请更新您将列表与问题中的单词匹配的要求。当人们在发布答案后更改需求时,通常会引起一些反馈。不过,这种情况也不少见!

标签: python python-3.x regex


【解决方案1】:

如果您有一个单词列表并且想要获得一个正则表达式来匹配 Python 中的单词列表,您可以使用 |(或)定义一个带有子模式的模式,并将单词列表中的单词连接起来。例如:

import re

word_list = ['ate', 'eat', 'eaten']

pattern = rf'(\w+)\s*(?:\b(?:{"|".join(word_list)})\b)'

result1 = re.findall(pattern, 'Ujjwal ate the apple.')

print(result1)
# output:
['Ujjwal']

result2 = re.findall(pattern, 'Ujjwal eaten the apple.')

print(result2)
# output:
['Ujjwal']

在这里,我们使用 r-string 和 f-string 来保存模式。

f-string 中的{"|".join(word_list)} 将解析为ate|eat|eaten,有效地将正则表达式设为r'(\w+)\s*(?:\b(?:ate|eat|eaten)\b)'

【讨论】:

  • @UjjwalMahajan 您可以在单词列表中输入“吃过”而不是“吃过”。代码已经支持这一点。或者,您必须修改正则表达式以包含可选的had|has|have 等。例如rf'(\w+)\s*(?:had|has|have)?\s*(?:\b{"|".join(word_list)}\b)' 但这会不太通用。
  • 对边界锚\b在正则表达式中的位置稍作修改。
  • @UjjwalMahajan 你可以试试pattern = rf'(\w+)\s*(\w+)?\s*(?:\b(?:{"|".join(word_list)})\b)'re.findall(pattern, 'Ujjwal Mahajan ate the apple.') 的结果将是:[('Ujjwal', 'Mahajan')]
  • @UjjwalMahajan 你得到什么结果/错误?
  • @UjjwalMahajan 如果您想提取 2 个单词作为一个条目(而不是 2 个条目的一个元组),您也可以使用 pattern = rf'(\w+(?:\s*\w+)?)\s*(?:\b(?:{"|".join(word_list)})\b)'re.findall(pattern, 'Ujjwal Mahajan ate the apple.') 将是:['Ujjwal Mahajan']
【解决方案2】:

对于常用词(任何单词字符(相当于[a-zA-Z0-9_]))你可以使用

import re
results = re.findall('(\w+) ate', 'Ujjwal ate the apple.')
print(results)

print 的结果是

['Ujjwal']

[编辑]

如果你必须检查很多单词(见 cmets)

list_of_words = ['ate', 'eat', 'had eaten']
results = [re.findall('(\w+) {WORD}'.format(WORD='\\b' + '\\b \\b'.join(word.split(' ')) + '\\b'), 'Ujjwal had eaten the apple.') for word in list_of_words]
print([item for sublist in results for item in sublist])

【讨论】:

  • 实际上,我有一个列表,其中包含“Ujjwal 吃过苹果”中的“吃”、“吃”、“吃”等词。这里也应该提取 Ujjwal。如何检查列表中的单词而不是“吃”本身。
  • 这不是你的问题。给出的答案已经回答了你的问题。如果您还有其他问题,您应该发布一个额外的问题,其中包含更多详细信息,最好带有指向此问题的链接,说明这是一个后续问题。
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2019-04-10
  • 2022-12-10
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多