2016-05-12 16 views
0

は本当に奇妙な問題を抱えています。私の(パイソン)正規表現は次のようになります。re.findallでRegEx/Python:オプションの空白が見つかりません

u'^.*(?:Grundfl|gfl|wfl|wohnfl|whg|wohnung).*(\s\d{1,3}[.,]?\d{1,2}?)\s*(?:m\u00B2|qm)' 

() - 用語が、これは次のテキストのために2試合を投げる必要があります:「...71m²から83m²し」しかし を、のみ83が一致する。この問題は、数(\ s \ d {1,3} [。、]?\ d {1,2}?)と平方メータ(?:m \ u00B2 | qm)の間の任意の空白と関係がある。 \ s *を削除すると、71個だけが期待通りに一致します。私は正規表現に何が間違っているのか分かりません。 ありがとうございました!

+1

質問はやや不明確である:あなたが最初の数を取得したいですか? *?\ s(\ d {1,3} [。、]?\ d {1,2}?)\ {\} {\ fB \ s *(?:m \ u00B2 | qm) '](https://regex101.com/r/iU2iV0/1)。パターンは '^'で文字列の先頭に固定されているので、2つのマッチは得られません。それでは、['^。*?(?: Grundfl | gfl | wfl | wohnfl | whg | wohnung)。*?\ s(\ d {1,3} (s:(s、s)、s(d:1,3)、...、d) :m \ u00B2 | qm))?]](https://regex101.com/r/iU2iV0/3)。または、単純な['(\ d {1,3} [。、]?\ d {1,2}?)\ s *(?:m \ u00B2 | qm)'](https://regex101.com/r/iU2iV0/4) –

+0

これを再現することはできません - '\ s *'を削除しても一致は変わりません:https://regex101.com/r/mO1rH2/1 - d {1,2}? 'は" 1桁または2桁の数字にマッチすることを意味しません。オプションで "\ d {0,2}"が必要です。 –

+0

['(\ d {1,2})\ D +(\ d {1,2})'](https://regex101.com/r/mO1rH2/2)を単純化することはできませんか? – Jan

答えて

0

肯定的な先読みを試してみませんか?これは、後にまたはqmがある限り、1桁の数字と一致します(オプションのカンマが入ります)。数字と単位の間の任意のスペースがあります:。

>>> import re 
>>> re.findall("[\d|\,]{1,}(?=\s{0,4}[m\u00B2|qm])", "from 71m² to 83m²") 
['71', '83'] 
>>> re.findall("[\d|\,]{1,}(?=\s{0,4}[m\u00B2|qm])", "from 71,56 m² to 837,78 qm") 
['71,56', '837,78'] 
>>> 

は、それはあなたが指定した言葉考慮されていませんが、あなたは簡単にその部分を再度追加することができます。しかし非を返す)(re.findall -overlappingという結果になるので、検索で文字列の先頭を指定すると、最初の値が返されます。一致する部分が効果的に '切り捨てられる'ため、2番目の部分は決して見つけられません。

+0

ああ、入力文字列に '100m² 'はありませんか?浮動小数点数またはすべての整数を考慮しない場合、なぜこの答えを受け入れますか? –

+0

're.findall'でキャプチャグループを使うことができるので、先読みを使うことには意味がありません。 –

+0

@WiktorStribiżewあなたは精巧にできますか?先読みは、後の単位を持つ数字にのみ一致します。そうでなければ、文字列の任意の数字は一致を返します.. –

0

あなたはre.findallと、次の正規表現を使用することができます。

(\d*[.,]?\d+)\s*(?:m\u00B2|qm) 

regex demoを参照してください。 re.findallは、グループ1のキャプチャ値のリストのみを返します。

パターンの詳細:

  • (\d*[.,]?\d+) - 整数または浮動小数点数を含むグループ1:0+数字は、1または0 .又は,で追跡1+数字
  • \s*と続く - 0+空白
  • (?:m\u00B2|qm) - またはqmのいずれかです。

Python demoを参照してください:

# -*- coding: utf-8 -*- 
import re 
p = re.compile(u'(\d*[.,]?\d+)\s*(?:m\u00B2|qm)') 
s = u"wohnung from 71,556m² to 183.4456m²" 
print(p.findall(s)) # => [u'71,556', u'183.4456'] 
関連する問題