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

时间:2018-08-21 12:01:07

标签: python regex regex-negation regex-group regex-greedy

我正尝试在正则表达式后面加上以下文字。

正则表达式:

(\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:由于以前收到的问题不很理想,我的帐户已关闭,因此我已将其改为以前的问题。因此,尝试改善问题以解锁帐户。

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

1 个答案:

答案 0 :(得分:1)

您使用的\s与任何类型的垂直和水平空格都匹配。如果您打算只匹配空格和制表符,请用[ \t]替换它。

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

此外,您不需要围绕整个模式的捕获组,您可以始终通过组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