正则表达式-如果不匹配则匹配-Python

时间:2019-07-05 00:50:28

标签: python regex

我对大量文本表示歉意,但我对此无能为力,我想说清楚我的问题。

我目前正试图创建一个正则表达式来查找网站/电子邮件链接的结尾,以便随后处理地址的其余部分。我决定寻找地址的结尾(例如,“。com”,“。org”,“。net”);但是,在处理此问题时,我在两个方面遇到困难。 (我选择此方法是因为它最适合当前项目)

首先,我试图避开阻碍用户输入其中包含这些关键字的单词(例如,“ org” anisation”,“尝试输入”或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

在此问题上的任何帮助,我真的很感激,这已经有一段时间了。我只是想看透,但是我不具备必需的知识。

编辑:

正则表达式需要通过的测试用例(这些示例专用于“ 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需要做什么。

3 个答案:

答案 0 :(得分:2)

以下正则表达式:

(?i)(?<=\.)org(?:\.[a-z]{2})?\b

应该为您完成工作。

演示:

https://regex101.com/r/8F9qbQ/2/

说明:

  • (?i)以区分大小写(.ORG.org
  • (?<=。)强制在.实际上是单词的一部分时,在org之前有一个org,以避免匹配。
  • org以匹配ORGorg
  • (?:...)?个非捕获组,可以出现01
  • \.[a-zA-Z]{2}点后紧跟2个字母
  • \b单词边界约束

答案 1 :(得分:1)

还有其他一些更简单的方法来捕获任何网站,但是假设您确实需要功能IF: NOT org(\w) ELSE IF: org(.|dot) THEN: MATCH org(.|dot)\w\w ELSE: MATCH org,则可以使用:

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

它将匹配: www.domain.org.uk的“ org.uk” www.domain.org的“ org”

但不匹配www.domain.orgzzorgzz

说明: org(?!\w)部分将与org匹配,后跟字母字符。它将与org的{​​{1}},org的{​​{1}}相匹配,但与org不相符。

然后,如果我们已经有了org.,我们将尝试通过添加量词orgzz来匹配其他org,这意味着如果有匹配项,则将匹配(\.\w\w),但这不是必需的。

答案 2 :(得分:0)

我制作了一个正则表达式来捕获一个网站,只要它以'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'

现在,您可以根据需要加强此功能,以避免误报。