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

В настоящее время я пытаюсь создать выражение регулярного выражения, чтобы найти конец ссылки на веб-сайт / электронную почту, чтобы затем обработать оставшуюся часть адреса. Я решил искать конец адреса (например, «.com», «.org», «.net»); однако, я испытываю трудности в двух областях, когда имею дело с этим. (Я выбрал этот метод, так как он лучше всего подходит для текущего проекта)

Во-первых, я пытаюсь обойти случайно мешающих пользователям вводить слова с этими ключевыми словами (например, "" org "анисация", "попробуйте это" или g "o to"). Как я решил это, например, регулярное выражение:

org(?!\w) - пропустить совпадение, если сразу после ключевого слова есть буквы.

Вторичной проблемой является поиск дополнительных частей адреса (например, «www.website.« Org ».uk»), которые не будут сопоставлены. Для борьбы с этим, в качестве примера, я использовал регулярное выражение:

org((\W*|\.|dot)\w\w) - при попытке найти первые две буквы после ключевого слова, так как большинство расширений состоят только из двух букв.

Основная проблема .

Чтобы предотвратить обе вышеуказанные ситуации, я использовал регулярное выражение, похожее на:

org(.|dot)\w\w|(?!\w)

Тем не менее, я не настолько сведущ, как мне хотелось бы быть в Regex, чтобы найти решение, и я понимаю, что это не приведет к правильным результатам. Я знаю, что в Regex есть форма «Если это, то это», но я просто не могу понять онлайн-документацию по этому вопросу, которую я нашел.

Если возможно, кто-нибудь сможет объяснить, как я могу создать систему, чтобы сказать:

IF: NOT org(\w) ELSE IF: org(.|dot) THEN: MATCH org(.|dot)\w\w ELSE: MATCH org

Я был бы очень признателен за любую помощь по этому вопросу, это было в моей голове некоторое время сейчас. Я просто хотел бы довести это до конца, но у меня просто нет необходимых знаний.

< Сильный > Edit:

Контрольные примеры, которые Regex должен будет пройти (специально для регулярного выражения 'org' для этих примеров):

(Я пометил совпадения в квадратных скобках '[]', и пометил возможные совпадения, которые следует игнорировать с помощью <<>)

"Hello, please come and check out my website: www.website.[org]"
"I have just uploaded a new game at games.[org.uk]"
"If you would like quote please email me at email@email.[org.ru]"
"I have just made a new <org>anisation website at website.[org], please get in contact at name.name@email.[org.us]"
"For more info check info.[org] <or g>o to info.[org.uk]"

Я надеюсь, что это позволит лучше понять, что нужно делать Regex.

1
F Mckinnon 5 Июл 2019 в 03:50

2 ответа

Я сделал небольшое регулярное выражение, которое фиксирует веб-сайт, если он начинается с 'www.', за которым следуют некоторые символы со следующим '.'.

import re 

matcher = re.compile('(www\.\S*\.\S*)') #matches any website with layout www.whatever
string = 'they sky is very blue www.harvard.edu.co see nothing else triggers it, www, org'
match = re.search(matcher, string).group(1)
#output
#'www.harvard.edu.co'

Теперь вы можете усилить это по мере необходимости, чтобы избежать ложных срабатываний.

0
Robert Kearns 5 Июл 2019 в 02:14

Есть еще один более простой способ поймать любой веб-сайт, но при условии, что вам точно нужна функция IF: NOT org(\w) ELSE IF: org(.|dot) THEN: MATCH org(.|dot)\w\w ELSE: MATCH org, вы можете использовать:

org(?!\w)(\.\w\w)?

Это будет соответствовать: "org.uk" из www.domain.org.uk "org" из www.domain.org

Но не будет соответствовать www.domain.orgzz и orgzz

Объяснение : Часть org(?!\w) будет соответствовать org, за которой не следует буквенный символ. Он будет соответствовать org из org, org из org., но не будет соответствовать orgzz.

Затем, если у нас уже есть org, мы попытаемся найти совпадение с дополнительным (\.\w\w), добавив квантификатор ?, что означает совпадение, если оно есть, что будет соответствовать {{X3 }} но это не обязательно.

1
Kevin Winata 5 Июл 2019 в 01:14