Регулярное выражение для соответствия слов с последующим пробелом или пунктуацией - PullRequest
1 голос
/ 03 апреля 2020

Если у меня есть слово india

МАТЧИ "india!" "india!" "india." "india"

НЕ МАТЧИ "indian" "indiana"

По сути, я хочу сопоставить строку, но не когда содержится в другой строке.

Проведя некоторое исследование, я начал с

exp = "(?<!\S)india(?!\S)" num_matches = len(re.findall(exp))

, но это не соответствует пунктуации, и я не уверен, куда добавить это.

Ответы [ 6 ]

2 голосов
/ 03 апреля 2020

Предполагая, что цель состоит в том, чтобы соответствовать заданному слову (например, "india") в строке, при условии, что за словом не предшествует и не следует символ, которого нет в строке " .,?!;", вы можете использовать следующее регулярное выражение: * Движок регулярных выражений 1003 *

(?<![^ .,?!;])india(?![^ .,?!;\r\n])

Demo

Python выполняет следующие операции

(?<!             # begin a negative lookbehind
  [^ .,?!;]      # match 1 char other than those in " .,?!;"
)                # end the negative lookbehind
india            # match string
(?!              # begin a negative lookahead   
  [^ .,?!;\r\n]  # match 1 char other than those in " .,?!;\r\n"
)                # end the negative lookahead

Обратите внимание, что класс символов в отрицательном прогнозе содержит \r и \n в случае, если india находится в конце строки.

1 голос
/ 04 апреля 2020

Если вы также хотите сопоставить знаки препинания, вы можете использовать класс с отрицанием , где вы можете сопоставить любой символ, кроме символа слова или символа новой строки.

(?<!\S)india[^\w\r\n]*(?!\S)
  • (?<!\S) Утверждение пробела буна dry влево
  • india Совпадение буквально
  • [^\w\r\n] Совпадение 0+ раз с любым символом, кроме слова char или символа новой строки
  • (?!\S) Установить границу пробела справа

Демонстрация регулярных выражений

1 голос
/ 03 апреля 2020

Попробуйте это ^india[^a-zA-Z0-9]$

^ - регулярное выражение начинается с Индии

[^a-zA-Z0-9] - не аз, AZ, 0-9

$ - End Regex

1 голос
/ 03 апреля 2020
\"india(\W*?)\" 

это поймает все, кроме цифр и букв

1 голос
/ 03 апреля 2020

вы можете использовать:

import re

s = "india."
s1 = "indiana"
print(re.search(r'\bindia[.!?]*\b', s))
print(re.search(r'\bindia[.!?]*\b', s1))

вывод:

<re.Match object; span=(0, 5), match='india'>
None
1 голос
/ 03 апреля 2020

Попробуйте с помощью:

r'\bindia\W*\b'

См. demo


Чтобы игнорировать регистр:

re.search(r'\bindia\W*\b', my_string, re.IGNORECASE).group(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...