2016-09-07 2 views
0

F8Pythonでカンマ区切りの値を含むテキストの正規表現を書くには?私はこのような行からF8フィールドにF1を取得するためにPythonで正規表現を記述しようとしている

LineNumber(digits): F1, F2, F3, ..., F8; 

F1は、大文字/小文字とハイフンを持つことができます。例えば

:私がこれまで試したどのような

Header 
Description 
21: Yes, No, Yes, No, Ye-s, N-o, YES, NO; 
Footer 

は、上記のフォーマットを持つ行に一致する matched = re.match(r'\d+: ([a-zA-Z-]*,){7}(.*);', line)です。しかし、matched.groups()と入力して一致するフィールドを印刷すると、F7,F8が表示されますが、期待される出力はF1,からF7,F8のリストになります。

私はこの正規表現に関するいくつかの質問があります。

  1. 私はgroups()方法は(...)を使用して正規表現にグループ化されたフィールドを返すと思います。 (...)を使用してグループ化されており、正規表現と一致しているのに、出力でF1からF6を取得しないのはなぜですか?

  2. F1からF7への,を除外するために書くことができる優れた正規表現は何ですか?あなたは(pattern){number}のような構造を持っている場合は、それが複数のインスタンスに一致するが、(提案正規表現の短い説明がはるかに高く評価される)

+1

なぜあなたはcsvとして解析しませんか? –

+0

@PadraicCunninghamドキュメントには、このパターンと一致しない他の行があります。さらに、行番号は各行の先頭に表示されます。 CSVとしての解析はまだ機能しますか? – Mahdi

+0

適切なサンプルを追加すると、私はあなたに伝えることができます。 –

答えて

0

することは、その後、最後のものだけが保存されます。つまり、複数回解析する場合でも、1つのバケットは()になります。この場合、最後のインスタンスは保持されます。 (a(b)?c)?ddと一致するように、使用されていなくても、すべてのブラケットペアのバケットが取得されることに注意してください。

あなたが期待する項目の数を知っているならば、あなたは長い道のりあなたの正規表現を行うことができます。

\d+: *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *, *([a-zA-Z-]+) *;

をこのように、あなたは括弧の8セットを持っているので、あなたはmatched.groups()で8つのアイテムを持っていますアレイ。また、フィールド間のスペースやカンマをキャプチャしていません。

あなたの文字列がCSVであるとすれば、行全体を一致させるために単一の正規表現を使用するのではなく、異なる構文解析とカンマで分割するほうが良いかもしれません。

+0

Steveに感謝します。私は読まなければならないフィールドが常に8つあります。しかし、私は、同じパターンを何度も繰り返すソリューションを避けようとしていました。 詳細な説明をありがとうございます。 – Mahdi

+0

なぜそれだけではないのですか? –

+1

これは理想的な正規表現ではありません...私はあなたがはるかに良いことができると思います –

1
>>> pat = re.compile("""\s+ # one or more spaces 
         (.*?) # the shortest anything (capture) 
         \s* # zero or more spaces 
         [;,] # a semicolon or a colon 
        """,re.X) 
>>> pat.findall("LineNumber(digits): F1, F2, F3, F4, F5, F6, F7, F8;") 
['F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8'] 
+0

ありがとうございます。このソリューションはうまくいきます。どのように簡単に説明できますか? – Mahdi

+0

そこに行く: –

+0

ありがとう。この解決策の唯一の問題は、コンマで区切られているがパターンに従わないヘッダーの一部のテキストと一致することです。 – Mahdi

関連する問題