我有推文列表,我必须从中选择包含“促销”,“折扣”或“优惠”等字词的推文。另外,我需要通过识别“%”,“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)
这段代码没有给我任何正确的结果,并且作为正则表达式的菜鸟,我无法弄清楚它的错误。谁能建议一个更好的方法来完成这项工作?任何帮助表示赞赏。
答案 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: