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 風でない場合は申し訳ありません):

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+)NOT 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)

?いいねがない場合を処理するために、最後のキャプチャの後に も置いていることに気付くでしょう。

regex101 デモ.

于 2013-09-13T08:27:56.470 に答える