【问题标题】:Ignoring new line between matched string in regex忽略正则表达式中匹配字符串之间的新行
【发布时间】:2018-08-21 12:01:07
【问题描述】:

我正在尝试使用下面的正则表达式。

正则表达式:

(\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:我已经从之前的问题中更改了这个问题,因为它没有得到很好的接受并且我的帐户已关闭。因此,尝试改进问题以解锁帐户。

请忽略之前的答案和cmets。

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2010-11-19
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多