正则表达式匹配第一个和最后一个单词或任何单词

时间:2013-12-13 00:20:43

标签: python regex file file-io

我有一个巨大的文件,其中包含以下数据列表:

 #fabulous       7.526   2301    2
 #excellent      7.247   2612    3
 #superb 7.199   1660    2
 #perfection     7.099   3004    4
 #terrific       6.922   629     1

我有一个包含这样句子列表的文件:

Terrific Theo Walcott is still shit, watch Rafa and Johnny deal with him on Saturday.
its not that I'm a GSP fan, fabulous
Iranian general says Israel's Iron Dome can't deal with their missiles 
with J Davlar 11th. Main rivals are team Poland. 

我想用正则表达式检查以下内容:

  1. 如果每个句子中的第一个单词与文件中的任何单词匹配 例如,如果太棒了,它的伊朗人,是否存在于文件中

  2. 如果句子中的最后一个单词与文件中的任何单词匹配 例如,如果星期六,神话般的,导弹,波兰出现在文件中

  3. 如果句子中单个单词的2或3个字符前缀和后缀与文件中的2个或3个字符前缀和后缀相匹配 例如,Ter,it,Ira,wi是否匹配文件中的任何2或3个单词前缀。同样适用于后缀。

  4. 我是正则表达式的新手,我可以这么想,但没有得到结果: term2.lower()是文件中的第一列

        wordanalysis["trail"] = found if re.match(sentence[-1],term2.lower()) else not(found)
        wordanalysis["lead"] = found  if re.match(sentence[0],term2.lower()) else not(found)
    

1 个答案:

答案 0 :(得分:3)

更新:根据@justhalf提出的很棒的建议,无需使用正则表达式来分割单词。如果您想要区分大小写的匹配,请删除.lower()

这将匹配数据列表中的第一个单词和最后一个单词(不包括任何标点符号或尾随空格):

(^\s?\w+\b|(\b\w+)[\.?!\s]*$)

<强>匹配

MATCH 1-1. Terrific
MATCH 2-1. Saturday.
        2. Saturday
MATCH 3-1. its
MATCH 4-1. fabulous
        2. fabulous
MATCH 5-1. Iranian
MATCH 6-1. missiles 
        2. missiles
MATCH 7-1. with
MATCH 8-1. Poland. 
        2. Poland

<强>实施

import re, string

sentences = open("sentences.txt").read().splitlines()
data = open("data.txt").read()
pattern = re.compile(r"(^\s?\w+\b|(\b\w+)[\.?!\s]*$)")
for line in sentences:
    words = line.strip().split()
    first = words[0].lower()
    last = words[-1].translate(None, string.punctuation).lower()
    if (re.search(first, data, re.I)):
        print "Found " + first + " in data.txt"
    if (re.search(last, data, re.I)):
        print "Found " + last + " in data.txt"

这可能不是最优雅的方式,但你明白了。

代码经过测试并正常工作,输出为:

Found Terrific in data.txt
Found fabulous in data.txt

这还没有达到你的第三个标准,测试一下,看看它到目前为止是否正常工作。