2016-05-12 26 views
0

有一个非常奇怪的问题。我的(Python)的正则表达式如下:RegEx/Python:未找到可选空白

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个符合预期。我不知道我的正则表达式有什么问题。 感谢您的帮助!

+1

的问题是有些含糊:你想要得到的第一个数字?然后尝试['^。*(?: Grundfl | gfl | wfl | wohnfl | whg | wohnung)。*?\ s(\ d {1,3} [。,]?\ d {1,2}?)\ S *(?:米\ u00B2 | QM)'](https://regex101.com/r/iU2iV0/1)。你不会得到两个匹配,因为这个模式被锚定在一个字符串的开头,并且用^ ^。所以,也可以尝试['^。*?(?: Grundfl | gfl | wfl | wohnfl | whg | wohnung)。*?\ s(\ d {1,3} [。,]?\ d {1,2} ?)\ S *(??:米\ u00B2 | QM)(:\ S +到\ S +(\ d {1,3} \ d {1,2} [。]?)\ S *(? :米\ 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

为什么不尝试使用积极的lookahead?这将匹配1+个数字(内部带有可选的逗号),只要其后有qm即可。有数字和单位之间的可选空间。

>>> 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()返回非 - 重叠结果,所以如果您在搜索中指定了字符串的起始位置,它将只返回第一个值,因为它有效地“剪掉”匹配的部分,因此从不会找到第二部分。

+0

啊哈,输入字符串中不能有'100m²'?为什么接受这个答案,如果它不考虑花车或所有整数? –

+0

使用预览功能没有意义,因为您可以使用带're.findall'的捕获组。 –

+0

@WiktorStribiżew你能详细说明吗?前景是这样的,它只匹配后面有单位的数字,否则字符串中的任何随机数字都会返回一个匹配项。 –

0

您可以使用以下正则表达式与re.findall

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

regex demore.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']