我正尝试在正则表达式后面加上以下文字。
正则表达式:
(\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:由于以前收到的问题不很理想,我的帐户已关闭,因此我已将其改为以前的问题。因此,尝试改善问题以解锁帐户。
请忽略先前的答案和评论。
答案 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]*
,以确保未捕获数字后的空格。
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