Python:匹配某些术语的字符串

时间:2014-02-11 11:28:24

标签: python regex

我有推文列表,我必须从中选择包含“促销”,“折扣”或“优惠”等字词的推文。另外,我需要通过识别“%”,“Rs。”,“$”等内容来查找宣传特定交易(如折扣)的推文。我完全不知道正则表达式,文档没有让我到任何地方。这是我的代码。这很糟糕,但请原谅

import pymongo
import re
import datetime
client  = pymongo.MongoClient()
db = client .PWSocial
fourteen_days_ago = datetime.datetime.utcnow() - datetime.timedelta(days=14)
id_list = [57947109, 183093247, 89443197, 431336956]
ar1 = [" deal "," deals ", " offer "," offers " "discount", "promotion", " sale ", " inr", " rs", "%", "inr ", "rs ", " rs."]
def func(ac_id):
    mylist = []
    newlist = []
    tweets = list(db.tweets.find({'user_id' : ac_id, 'created_at': { '$gte': fourteen_days_ago }}))
    for item in tweets:
        data = item.get('text')
        data = data.lower()
        data = data.split()
        flag = 0
        if set(ar1).intersection(data):
            flag = 1
        abc = []
        for x in ar1:
            for y in data:
                    if re.search(x,y):
                        abc.append(x)
                        flag = 1
                        break
        if flag == 1:
            mylist.append(item.get('id'))
            newlist.append(abc)
    print mylist
    print newlist
for i in id_list:
    func(i)

这段代码没有给我任何正确的结果,并且作为正则表达式的菜鸟,我无法弄清楚它的错误。谁能建议一个更好的方法来完成这项工作?任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

我的第一个建议 - 学习正则表达式,它为您提供无限的文本处理能力。

但是,为了给你一些有用的解决方案(并开始进一步探索),试试这个:

import re

re_offers = re.compile(r'''
    \b  # Word boundary
        (?:  # Non capturing parenthesis
            deals?  # Deal or deals
            |  # or ...
            offers?  # Offer or offers
            |
            discount
            |
            promotion
            |
            sale
            |
            rs\.?  # rs or rs.
            |
            inr\d+  # INR then digits
            |
            \d+inr  # Digits then INR
        )  # And group
    \b  # Word boundary
    |  # or ...
    \b\d+%  # Digits (1 or more) then percent
    |
    \$\d+\b  # Dollar then digits (didn't care of thousand separator yet)
    ''',
    re.I|re.X)  # Ignore case, verbose format - for you :)

abc = re_offers.findall("e misio $1 is inr123 discount 1INR a 1% and deal")
print(abc)

答案 1 :(得分:1)

您可能需要考虑从find而不是正则表达式开始。您没有复杂的表达方式,而且当您处理一行文字时,您不需要拨打split,而只需使用find

for token in ar1:
    if data.find(token) != -1:
        abc.append(data)

您在推文循环中的项目变为:

for item in tweets:
    data = item.get('text')
    data = data.lower()
    for x in ar1:
        if data.find(x)    
             newlist.append(data)
             mylist.append(item.get('id'))
             break

Re:您对jonsharpe帖子的评论,以避免包含子字符串,用空格包围您的标记,例如" rs"," INR"

答案 2 :(得分:1)

您不需要使用正则表达式,可以使用any

if any(term in tweet for term in search_terms):

答案 3 :(得分:1)

在您搜索的数组中,“offer”和“discount”之间没有逗号,导致它们连接在一起。

此外,当您使用分割时,您将摆脱输入文本中的空白。 “我有一笔交易”将成为[“我”,“有”,“一个”,“交易”]但你的搜索条件几乎都包含空格。因此,请从数组ar1中的搜索词中删除空格。

但是你可能想避免使用正则表达式而只是使用in(你仍然需要我上面提到的chnages):

    if x in y: