Как искать подстроку в строке с определенными правилами, используя регулярные выражения? - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть строка, подобная приведенной ниже

Hello there how are you?

Я хочу найти в строке подстроку 'there how'.Поэтому я бы сделал что-то вроде этого

import re
string = "Hello there how are you?"
term = "there how"
print(re.search("\s" + term + "\s",  string).group(0)). # /s is used to ensure the match should be an independent phrase

Но теперь проблема в том, что если я получу вариант строки, то совпадение не произойдет.Например, для таких строк:

Если между словами есть большой интервал

Hello there         how are you?

Если некоторые буквы пишутся с заглавной буквы

Hello There How are you?

Что я хочусделать, чтобы убедиться, что пока подстрока 'there how' присутствует в строке как отдельная фраза (не как Hellothere how are you? или Hello there howare you? и т. д.), я смогу найти совпадение.

Какя могу достичь цели?

1 Ответ

2 голосов
/ 24 сентября 2019

Вы можете заменить пробелы на \s+ в term и использовать сопоставление без учета регистра, передав флаг re.I:

import re
ss = ["Hello there how are you?", "Hello there         how are you?", "Hello There How are you?"]
term = "there how"
rx = re.compile(r"(?<!\S){}(?!\S)".format(term.replace(r" ", r"\s+")), re.I)

for s in ss:
    m = re.search(rx,  s)
    if m:
        print(m.group())

Вывод:

there how
there         how
There How

См. Python demo

ПРИМЕЧАНИЕ : если term может содержать специальные метасимволы регулярных выражений, вам необходимо re.escape term, но сделайте это перед заменойпробелы с \s+.Поскольку пробелы экранируются с помощью re.escape, вам необходимо .replace(r'\ ', r'\s+'):

rx = re.compile(r"(?<!\S){}(?!\S)".format(re.escape(term).replace(r"\ ", r"\s+")), re.I)

Решение JavaScript:

var ss = ["Hello there how are you?", "Hello there         how are you?", "Hello There How are you?"];
var term = "there how";
var rx = new RegExp("(?<!\\S)" + term.replace(/ /g, "\\s+") + "(?!\\S)", "i");
for (var i=0; i<ss.length; i++) {
    var m = ss[i].match(rx) || "";
    console.log(m[0]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...