[英]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
ORG
或org
(?:...)?
非捕获组,可以出现0
到1
次 \\.[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.orgzz
和orgzz
说明: org(?!\\w)
组成部分将匹配org
是后面没有字母字符。 它将与org
的org
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.