繁体   English   中英

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

[英]Regex - If not match then match this - Python

我为文字的数量道歉,但我无法理解这一点,我想让我的问题清楚。

我目前正在尝试创建一个正则表达式来查找网站/电子邮件链接的结尾,然后处理其余的地址。 我决定寻找地址的结尾(例如'.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 this then that'但我似乎无法理解我在这个主题上找到的在线文档。

如果可能,有人能够解释我如何创建一个系统来说:

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需要做什么。

以下正则表达式:

(?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字边界约束

还有一些其他更简单的方法可以捕获任何网站,但假设你确实需要这个特征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的“组织” www.domain.org

但是不会匹配www.domain.orgzzorgzz

说明: org(?!\\w)组成部分将匹配org是后面没有字母字符。 它将与orgorg org相匹配org. 但不会与orgzz匹配。

然后,如果我们已经有了org ,我们会尝试通过添加量词来匹配其他(\\.\\w\\w) ? 这意味着匹配,如果有,将匹配\\.uk但没有必要。

只要以'www.'开头,我就制作了一个捕获网站的小正则表达式'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'

现在你可以根据需要收紧它,以避免误报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM