Вы используете \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?
См. демонстрацию регулярного выражения.
Вы можете использовать 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:
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
person
Wiktor Stribiżew
schedule
11.09.2018
<prefixes>\s*(<NUM>)|(<NUM>)\s*<suffixes>
. Что-то вроде(\d[. \d\t]*)(?:pkg\b|k\b|lac\.|lakh\.|crore\.|cr\.|l\b)|\b(?:rent|rs)\.\s*(\d[. \d\t]*)
. См. также эту демонстрацию Python. - person Wiktor Stribiżew   schedule 21.08.2018(rent|rs)?([\s.]*\d+[\s\d.]*)(pkg|k|(?:la(?:c|kh)|crore|cr)s?|l)
. Посмотреть демо здесь regex101.com/r/ziAOMw/4 - person revo   schedule 21.08.2018.
в вашем шаблоне должны соответствовать любому символу? Я так понял, что это какие-то аббревиатуры. - person Wiktor Stribiżew   schedule 21.08.2018