有一个非常奇怪的问题。我的(Python)RegEx看起来像这样:
u'^.*(?:Grundfl|gfl|wfl|wohnfl|whg|wohnung).*(\s\d{1,3}[.,]?\d{1,2}?)\s*(?:m\u00B2|qm)'
在re.findall() - 术语中,这应该为以下文本输入两个匹配:“...从71m²到83m²” 但是,只有83匹配。这个问题与数字(\ s \ d {1,3} [。,]?\ d {1,2}?)和平方米(?:m \ u00B2 | qm)之间的可选空格有关,当我删除\ s *时,只有71符合预期。我不知道我的正则表达式有什么问题。 谢谢你的帮助!
答案 0 :(得分:0)
为什么不尝试使用积极的前瞻性?只要后面有m²
或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()会返回非重叠结果,因此如果您指定了开头在你的搜索中,它只会返回第一个值,因为它有效地“切掉”它匹配的部分,因此永远不会找到第二个部分。
答案 1 :(得分:0)
您可以将以下正则表达式与re.findall
:
(\d*[.,]?\d+)\s*(?:m\u00B2|qm)
请参阅regex demo。 re.findall
只会返回第1组捕获值的列表。
模式细节:
(\d*[.,]?\d+)
- 包含整数或浮点数的第1组:0+位数,后跟1或0 .
或,
后跟1+位数\s*
- 0+ whitespaces (?:m\u00B2|qm)
- m²
或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']