1

我是一名研究生,正在对公司墙上的一些公开 Facebook 评论进行一些研究。我只对频率感兴趣,而不是评论的文本。

所以我正在考虑做一个正则表达式来匹配我需要的东西,但我还不太擅长正则表达式。(另外,我只有文本格式的评论,而不是 html - 它们都在文本文件中。)

这意味着我需要解析每条评论的最后一行。我使用以下正则表达式:

(January|February|March|April|May|June|July|August|September|October|November|December \d+ at \d+:\d+[ap]m)|(Yesterday at \d+:\d+[ap]m)|(\d+ hours ago)|(About an hour ago) \D*?(\d+)

一些样本:

September 5 at 8:40pm · Like · 23
Yesterday at 5:35am · Like 
10 hours ago · Like · 2
6 hours ago · Like

我希望得到:

第 1 组:或者:[月] [日] 或昨天:上午/下午或 # 小时前第 2 组:喜欢的次数

Python中的代码(对不起,如果它不是超级Python-esque):

import re
for line in open('comments.txt','r'):
     strPat = '(January|February|March|April|May|June|July|August|September|October|November|December \d+ at \d+:\d+[ap]m)|(Yesterday at \d+:\d+[ap]m)|(\d+ hours ago)|(About an hour ago) \D*?(\d+)'
     pat1 = re.compile(strPat, line)
     m = re.match(pat1, line)
     if m:
          print m.group(1), m.group(2)

一些示例输出:

September 5 at 8:40pm None
None None

首先,它没有捕获“8 小时前”部分。其次,它似乎没有捕捉到任何情况下的点赞数。我敢肯定我的正则表达式模式有些奇怪。任何帮助将不胜感激。

4

1 回答 1

2

OR 运算符|没有像您预期的那样工作。

一个简单的例子是:

(\d+ hours ago)|(About an hour ago) \D*?(\d+)

这将匹配:(\d+ hours ago)OR(About an hour ago) \D*?(\d+)而不是(\d+ hours ago) \D*?(\d+)OR(About an hour ago) \D*?(\d+)

因此,您需要将它们分组,这里是一个非捕获组:

(?:(\d+ hours ago)|(About an hour ago)) \D*?(\d+)

将此原则应用于适用的正则表达式,您会得到一些更好的结果。

接下来,由于您有几行,我建议同时使用锚点和多行标志:

strPat = r'^(?:((?:January|February|March|April|May|June|July|August|September|October|November|December) \d+ at \d+:\d+[ap]m)|(Yesterday at \d+:\d+[ap]m)|(\d+ hours ago)|(About an hour ago)) \D*?(\d+)?$'
m = re.match(pat1, line, re.M)

你会注意到我?在最后一次捕获之后也放了一个,这是为了处理没有喜欢的情况。

正则表达式 101 演示

于 2013-09-13T08:27:56.470 回答