2017-04-01 9 views
0

文字列から単語形式の数字を抽出しようとしています。例えば、入力文字列のようなものかもしれません:この入力から単語形式で大きな数字を見つけるための正規表現

"What is 3 million 6 hundred 5 divided by 5 hundred?" 

、私はグループとして2つの数値を取得する方法を見つけ出すしたいと思います。

["3 million 6 hundred 5", "5 hundred"] 

注:他の入力文字列にはさらに多くの数字がある可能性があります。

正規表現はこの問題を解決する正しいルートだと思います。

["hundred", "thousand", "million", "billion", ...] 

はこれまでのところ、これは私が持っているものです::

scales= ["hundred", "thousand", "million", "billion"] 
scale_pattern = '|'.join(scales) 
regex = re.compile('\b(d+' + scale_pattern + 'd+)+\b') 

私は私のパターンは、どのような私のためにpsudeocodeかなり右ではありません知っている理想的には私のようなスケールのリストを渡すことができ「のつもりです:

for any number of the following occurrences: 
    find the pattern [int word_from_list optional_int] 
+1

うわー、多くの票がこの質問を閉じるために早く来ています。私はそれを改善するために何ができるかに関するフィードバック? – Gunther

+1

これまでに試したことを示してください。 – ArieKanarie

+0

ありがとうございます。私はこれまでのことでそれを更新します。 – Gunther

答えて

3

理想的には私はスケールのリストに

を渡すことができます

このように非キャプチャまたはキャプチャグループに渡すことができます。

正規表現:(?:\d+\s(?:million|hundred|thousand|billion)*\s*)+

上に空白\sスケール続い数\d+をチェックする簡単な正規表現である任意任意の空白が続く最後の数字のために(*数量詞を使用して)である 。そして、全体のパターンは、の1つまたは多くの回(+限定記号を使用して)繰り返されます。

Regex101 Demo

0

まあは、以下の劣るパーサーです。

# you should expand these lists later... 
units = ["hundred", "thousand", "million", "billion"] 
operations = ['divided', 'multiplied'] 
delims = ['by', 'with'] 
discards = ['?', '!', '.'] 

sentence = 'What is 3 million 6 hundred 5 divided by 5 hundred?' 

filterd_sentence = sentence 
for t in discards: 
    filterd_sentence = filterd_sentence.replace(t, '') 

filterd_t = [] 
buffer = '' 
for t in filterd_sentence.split(' '): 
    if t.isnumeric() or t in units: 
     buffer += t + ' ' 
    elif t in operations or t in delims: 
     if buffer != '': 
      filterd_t.append(buffer[:len(buffer)-1]) 
      buffer = '' 

if buffer != '': 
    filterd_t.append(buffer[:len(buffer)-1]) 

print(filterd_t) 
# ['3 million 6 hundred 5', '5 hundred'] 
関連する問題