2016-09-20 8 views
0

テキストからすべての文字列と数字を抽出しようとしています。regexを使用するとすべての数字と単語番号が抽出されます

text = 'one tweo three 10 number' 
numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \ 
      eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \ 
      eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \ 
      ninety|hundred|thousand)" 

print re.search(numbers, text).group(0) 

これは私に最初の桁の数字を与えます。

私の予想結果= [「1」、「2」、「3」、「10」]

すべての単語、よく桁の数字は、私がリストに得ることができるようにどのように私はそれを修正することができますか?

+0

'' re.findall'を使用して追加するには、以下より良いものが必要| [0-9 ] + 'あなたのパターンに分岐します。 https://ideone.com/w9Q0QZを参照してください。 'tweo'はタイプミスですか? –

+0

さて、ここにはもっと問題があります。あなたは、あなたがほとんどすべての言葉に興味があるので、私が信じる言葉の境界も使う必要があります。 –

+0

なぜ「10」にマッチするのですか? – ClasG

答えて

2

いくつかの問題がここにあります

  • パターンは冗長フラグと一緒に使用する必要があります(開始時(?x)を追加)
  • nineninetynineと一致しますので、あなたは長いを置く必要があるのいずれか値を最初に使用するか、単語境界を使用する\b
  • 構文解析のような問題を避けるために、生の文字列リテラルでパターンを宣言して、単語境界ではなくバックスペースとして
  • 桁と一致するには、入力文字列内の部分文字列の複数の非重複出現を一致させるには、あなたの数に一致するグループ
  • |\d+ブランチを追加することができ、あなたがre.findall(またはre.finditer)を使用する必要がなく、re.search

    import re 
    text = 'one two three 10 number eleven eighteen ninety \n ' 
    numbers = r"""(?x)   # Turn on free spacing mode 
          (
           ^a(?=\s)|  # Here we match a at the start of string before whitespace 
           \d+|   # HERE we match one or more digits 
           \b   # Initial word boundary 
           (?: 
            one|two|three|four|five|six|seven|eight|nine|ten| 
            eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| 
            eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| 
            ninety|hundred|thousand 
          )    # A list of alternatives 
           \b   # Trailing word boundary 
    )""" 
    
    print(re.findall(numbers, text)) 
    

    Python demo

    を参照してください。そして、ここでregex demoです:

は、ここに私の提案です。

1

あなたのリストには、re.findallと[0-9] +の追加がうまく機能します。あなたはあなたが得るseventythreeのようなものにマッチしようとした場合残念ながら - > 7と3を、このようにあなたはこの:-)

numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \ 
      eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \ 
      eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \ 
      ninety|hundred|thousand|[0-9]+)" 

x = re.findall(numbers, text) 
+0

'' seventhree'だけでなく、 'eighteen'、' eleven'、 'ninety'にもマッチしません。そして、「16」が見つかると、「6」だけが取り出されます。 https://ideone.com/jBOsxtを参照してください –

+0

正しい...これは私が指摘しようとしていた:-)あなたの見た目は良く見えますが、それは70と一致したいです。ではない?とにかく1ポイントプラスあなたのために...それは本当に便利なコードですので! :-) –

+0

OPが「七十三」と一致するかどうかを尋ねるなら、私はそれを見るでしょう。今、心配するのに十分な問題があります。 –

関連する問題