“配对词提取器” - 正则表达式

时间:2017-02-18 11:52:39

标签: python regex

我在Python中使用正则表达式来提取“和”字。含义,由和分隔的单词。

例如

  • 银行和金融
  • 盈亏

到目前为止的努力:

import re
read = open("sample.txt", "r")
regex = re.compile('(?:\S+\s)?\S*and\S*(?:\s\S+)?')
f=open('write.txt','w')
for line in read:
    words = regex.findall(line)
    for word in words:
        f.write(str(word)+'\n')
f.close()

这段代码似乎运行良好,但可以查找命令等内容。

所以我使用了这个正则表达式

regex = re.compile('a-zA-Z]+\s?\S*and\S*\s+[a-zA-Z]+')

在网站上运行良好,但只返回单词而没有前面的单词和后续单词作为python中的输出。

我的目的是找到在文档内和文档内分隔的单词。

输入

This is a sample text to find profit and loss. It should also find banking and finance. But it should not find commands.

当前输出

  • 盈亏。
  • 银行和金融。
  • 查找命令。

期待出局

  • 盈亏
  • 银行和金融

2 个答案:

答案 0 :(得分:2)

你让它变得比它需要的更复杂。只需使用以下正则表达式:

\S+\sand\s\S+

See it in action

问题是您在\S*附近添加了and。它匹配“和”周围的任意数量的非空白字符,这将匹配像“白兰地”这样的单词。

答案 1 :(得分:1)

你可以试试这个:

\w+(?=\sand\s)|(?<=\sand\s)\w+

这是:

  • 某些字词(\w+)仅在\sand\s之前与前瞻肯定为正的位置匹配,或者
  • 有些工作(\w+)仅匹配\sAnd\s跟随积极的后置断言的位置

正向后视需要一串固定长度的字符串,因此您无法执行(?<=\s+and\s+)所以此解决方案假设所有间距都是单个空格。

在regex101.com

Tested

enter image description here

修改

继续更新问题以获取某些内容 其他内容作为三个字您可以尝试的短语:

\w+(?:\s+and\s+)\w+
带有此输出的

Tested

enter image description here