忽略正则表达式中匹配字符串之间的新行
Ignoring new line between matched string in regex
我正在尝试使用下面的正则表达式。
正则表达式:
(\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<br>
情节
我不想在文本中用新行分隔的匹配词。
您可以Compile above regex更好地理解。
我们如何才能不在匹配项之间包含换行符。想要匹配单词之间有空格的单词。
谢谢
PS:我已经从以前的问题中更改了这个问题,因为它没有被很好地接受并且我的帐户被关闭了。因此,尝试改进问题以解锁帐户。
请忽略之前的回答和评论。
您使用的 \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]*
以确保未捕获数字后的空格。
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
我正在尝试使用下面的正则表达式。
正则表达式:
(\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<br>
情节
我不想在文本中用新行分隔的匹配词。
您可以Compile above regex更好地理解。 我们如何才能不在匹配项之间包含换行符。想要匹配单词之间有空格的单词。
谢谢
PS:我已经从以前的问题中更改了这个问题,因为它没有被很好地接受并且我的帐户被关闭了。因此,尝试改进问题以解锁帐户。
请忽略之前的回答和评论。
您使用的 \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]*
以确保未捕获数字后的空格。
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