Игнорирование новой строки между совпавшей строкой в ​​регулярном выражении

Я пытаюсь следовать регулярному выражению с текстом ниже.

Регулярное выражение:

(\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

Я не хочу сопоставлять слова в тексте, разделенные новой строкой.

Вы можете Компилировать приведенное выше регулярное выражение, чтобы лучше понять его. Как мы можем не включать новую строку между совпадениями. Хотите сопоставить слова с пробелами между словами.

Спасибо

PS: я изменил этот вопрос по сравнению с предыдущими вопросами, так как он не был хорошо принят, и мои учетные записи были закрыты. Поэтому пытаюсь улучшить вопросы, чтобы разблокировать учетные записи.

Пожалуйста, игнорируйте предыдущий ответ и комментарии.


person iamabhaykmr    schedule 21.08.2018    source источник
comment
Я бы посоветовал разделить регулярное выражение на 2 альтернативы, <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
comment
Попробуйте regex101.com/r/ziAOMw/3   -  person revo    schedule 21.08.2018
comment
Вам может не понадобиться регулярное выражение. Вот лучший способ: (1) создать dict со всеми типами валют (2) разделить входной текст и посмотреть слева от типов валют.   -  person rodcoelho    schedule 21.08.2018
comment
В зависимости от того, чего вы действительно хотите, вы также можете выбрать (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
comment
Спасибо всем . Это прекрасно работает.   -  person iamabhaykmr    schedule 21.08.2018
comment
Единственная проблема заключается в том, что он соответствует пробелам слева и справа, что вызывает проблему на моем следующем этапе проекта. Можем ли мы не сопоставлять левые и правые пробелы, если это возможно? @ВикторСтрибижев   -  person iamabhaykmr    schedule 21.08.2018
comment
Получил работу. Спасибо еще раз.   -  person iamabhaykmr    schedule 21.08.2018
comment
Эти неэкранированные . в вашем шаблоне должны соответствовать любому символу? Я так понял, что это какие-то аббревиатуры.   -  person Wiktor Stribiżew    schedule 21.08.2018
comment
Помогает ли это: stackoverflow.com/a/37571199/2064981   -  person SamWhan    schedule 21.08.2018


Ответы (1)


Вы используете \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