2016-10-30 2 views
-1

リクエストモジュールを使用してターゲットWebサイトからHTMLにアクセスし、Beautiful Soupを使用してWebサイトの特定の要素を選択しています。問題の要素は、英国プレミアリーグ2016/2017シーズンまでの結果を含む表です。表には、試合日、参加チーム、フルタイムスコア、ハーフタイムスコアが含まれています。 Pythonを使用して、テーブル要素のHTMLを解析し、そこにリストされているフィクスチャを抽出します。 。 - チームBサッカーチームのフィクスチャーを文字列で見つけるPythonの正規表現

チーム名は1-3の別個の文字列(例えばバーンリー、マンチェスター・ユナイテッド、ウェストハム・ユナイテッド

私の試みは、これまでであることができ

チームA:チームはいつものように記載されています:

輸入再 teamsRegex = re.compile(R '((\ワット+ \ S)+ - (\ S \ +)+ W)')

ここに私のロジックがある最初のチームができること1 -3個の文字列の長さが異なり、各文字列の後には常に空白文字が続くため、パターン(\ w + \ s)+は任意の長さの文字列の後に空白が続き、1回または複数回繰り返すことができます。 2番目のチーム名は、常に " - "文字の後の空白で始まり、1回または何回(\ s \ w +)+繰り返される任意の長さの文字列でもかまいません。

私は一種の望ましい結果を達成していますが、上記は完全に正しいわけではありません。私は、インデックス1、インデックスなどのインデックス0の最後の文字列としてインデックス0の最初の文字列が続くインデックス0で私の望ましい結果でリストを返しています。2.

例文字列:

「バーンリー - スウォンジー市内ALIGN =中央幅= 45> 0 - 1とALIGN =中央>(0-0)」

正規表現が見つかった:

[( 'バーン - スワンシー都市'、 'バーン'、 '都市')、 ( '0'、 '0'、 '1')]

[Burnley - Swansea City]]

何か助けを期待して多くの感謝を!チームの名前と一致するグループ(あなたが唯一の完全な一致を得ることができますので、?:

+0

あなたは、入力文字列内のHTMLの一部を取得します。あなたは次のように試してみることができます:[re:\ a * (?!=) ') '](http://ideone.com/HjuLTI)ですが、根本的な問題を解決するのが最善であると思います。 –

答えて

1
r'(?:[A-Z][a-z]*\s)+-(?:\s[A-Z][a-z]*)+' 

ここでは、二つの非キャプチャを持っています。私は明示的に文字を使用することを選択したので、式は大文字で始まる単語と一致し、数字は除外されます。チーム名に数字(「BVB 09」など)を含めることができる場合は、それを変更する必要があります。

HTMLファイルの内容によっては、最終的な先読みを追加することができます。具体的には(?= align)です。

編集: は3つの大文字とオプションの「&年代まで一致させるには、これを試してください:それは奇妙である

r'(?:[A-Z&]{1,3}[a-z]*\s)+-(?:\s[A-Z&]{1,3}[a-z]*)+' 
+0

これは素晴らしい解決策であり、正しく捕らえられなかったチーム名が2つあることがわかるまで完全にうまくいくように見えました。それらは次のとおりです。 1. QPレンジャー(最初の2文字が大文字になります)。 2. Brighton&Hove この正規表現では、正規表現は '&'記号をキャプチャしないので一致しません。 誰もJosefScriptの正規表現を修正して上記の例を取り込む方法について提案はありますか? 多くの感謝は前進です – Sam

+0

私の答えを編集しました。それが役に立てば幸い。 – JosefScript

関連する問題