忽略正则表达式中匹配字符串之间的新行

问题描述 投票:0回答:1

我正在尝试使用下面的文本跟随正则表达式。

正则表达式:

(\d+[\s\,\d.]*\s*(carpet|sft|feet|sqft|yard|gaj|feet|s.ft|sq.ft|sq feet|fq.ft.|sq.ft.
|pt|crpt|ft|sq.mt.|sq.mtr|sq.mt|plot|sf|sfqt|acer|gj|vigha|anna|gunta|sq|
gunthe|guntha|bigha|sqd|sqm|sqyd|area|acre|square|yrd|
sq.yard|sq yd|sq.yd|sq. yd.|gaj|sqt)s?)

输入文本:

kanakiya area 1350     sqft asking price : 95 lacs destination properties azymn - 9920902674 
 plot on rent near sp ring road rajpath club ki gali me road touch 5000 war na 350000 rent owner side no b

它正确匹配所有必需的字符串,但它也匹配9920902674
plot

我不希望文本中的匹配词由新行分隔。

你可以Compile above regex更好地理解。我们怎么能不在匹配之间包含新的行。想要匹配单词之间有空格的单词。

谢谢

PS:我之前的问题已经改变了这个问题,因为它没有得到好评,我的账户也被关闭了。因此,尝试改进问题以解锁帐户。

请忽略以前的答案和评论。

python regex regex-negation regex-group regex-greedy
1个回答
1
投票

您正在使用匹配任何类型的垂直和水平空格的\s。如果您打算仅匹配空格和制表符,请将其替换为[ \t]

此外,您应该考虑在模式中转义点(它们都在字符类之外)以匹配文字点,否则,它们匹配任何字符,但是匹配换行符。

此外,您不需要围绕整个模式的捕获组,您可能总是通过组0获得整个匹配(您可以在迭代使用re.finditer返回的所有匹配数据对象时访问)。

所以,你可以使用

\d[\d \t,.]*(?:carpet|sft|feet|sqft|yard|gaj|feet|s\.ft|sq\.ft|sq feet|fq\.ft\.|sq\.ft\.|pt|crpt|ft|sq\.mt\.|sq\.mtr|sq\.mt|plot|sf|sfqt|acer|gj|vigha|anna|gunta|sq|gunthe|guntha|bigha|sqd|sqm|sqyd|area|acre|square|yrd|sq\.yard|sq yd|sq\.yd|sq\. yd\.|gaj|sqt)s?

regex demo

您可以使用re.findall(pattern, s)将所有匹配作为列表。或者,如果需要包含特定子匹配的元组列表,请使用捕获括号包装这些部分。例如,要将数字捕获到一个组,将测量单位捕获到另一个组,请使用(\d(?:[\d ,.]*\d)?)[ \t]*((?:carpet|sft|feet|sqft|yard|gaj|feet|s\.ft|sq\.ft|sq feet|fq\.ft\.|sq\.ft\.|pt|crpt|ft|sq\.mt\.|sq\.mtr|sq\.mt|plot|sf|sfqt|acer|gj|vigha|anna|gunta|sq|gunthe|guntha|bigha|sqd|sqm|sqyd|area|acre|square|yrd|sq\.yard|sq yd|sq\.yd|sq\. yd\.|gaj|sqt)s?)。注意我将\d(?:[\d \t,.]*\d)? *修改为(\d(?:[\d ,.]*\d)?)[ \t]*以确保未捕获数字后面的空格。

Python demo

import re
s = "kanakiya area 1350     sqft asking price : 95 lacs destination properties azymn - 9920902674 \n plot on rent near sp ring road rajpath club ki gali me road touch 5000 war na 350000 rent owner side no b"
pattern = r'\d[\d ,.]*(?:carpet|sft|feet|sqft|yard|gaj|feet|s\.ft|sq\.ft|sq feet|fq\.ft\.|sq\.ft\.|pt|crpt|ft|sq\.mt\.|sq\.mtr|sq\.mt|plot|sf|sfqt|acer|gj|vigha|anna|gunta|sq|gunthe|guntha|bigha|sqd|sqm|sqyd|area|acre|square|yrd|sq\.yard|sq yd|sq\.yd|sq\. yd\.|gaj|sqt)s?'
print(re.findall(pattern, s))
pattern1 = r'(\d(?:[\d ,.]*\d)?)[ \t]*((?:carpet|sft|feet|sqft|yard|gaj|feet|s\.ft|sq\.ft|sq feet|fq\.ft\.|sq\.ft\.|pt|crpt|ft|sq\.mt\.|sq\.mtr|sq\.mt|plot|sf|sfqt|acer|gj|vigha|anna|gunta|sq|gunthe|guntha|bigha|sqd|sqm|sqyd|area|acre|square|yrd|sq\.yard|sq yd|sq\.yd|sq\. yd\.|gaj|sqt)s?)'
print("Now, with captures:")
for m in re.finditer(pattern1, s):
    print("{} => {}".format(m.group(1), m.group(2)))

输出:

['1350     sqft']
Now, with captures:
1350 => sqft
© www.soinside.com 2019 - 2024. All rights reserved.