由于这是一个正则表达式问题,这可能是一个重复的问题。
考虑这些给定的字符串
test_str = [
"bla bla google.com bla bla", #0
"bla bla www.google.com bla bla", #1
"bla bla api.google.com bla bla", #2
"google.com", #3
"www.google.com", #4
"api.google.com", #5
"http://google.com", #6
"http://www.google.com", #7
"http://api.google.com", #8
"bla bla http://www.google.com bla bla", #9
"bla bla https://www.api.google.com bla bla" #10
]
我希望返回的结果是
google.*
或者www.google.*
,但不包括api.google.*
。也就是说,在上面的例子中,2、5、8、10都不应该匹配。
我尝试了几个正则表达式,但无法找到一行代码来完成这个任务。以下是我尝试过的内容。
re.compile("((http[s]?://)?www\.google[a-z.]*)") # match 1,4,7,9
re.compile("((http[s]?://)?google[a-z.]*)") # match all
re.compile("((http[s]?://)?.+\.google[a-z.]*)") # match except 0,3,6
re.compile("((http[s]?://)?!.+\.google[a-z.]*)") # match nothing
在这里,我正在寻找一种忽略
*.google.*
但保留 www.google.*
和 google.*
的方法。但是,在寻找获取 *.google.*
的方法时遇到了困难。
PS:我已经找到了一个使用
split()
解决这个问题的 O(n**2) 方法。r = re.compile("^((http[s]?://)?www.google[a-z.]*)|^((http[s]?://)?google[a-z.]*)")
for s in test_str:
for seg in s.split():
r.findall(seg)
api
不是固定的,但我想筛选所有包括map.google.*
、calendar.google.*
在内的API。这是否意味着我需要逐一添加它们? - Kir Chou(?<!\bapi)(?<!\bmap)
这样链接回顾后发现,或者你可以使用基于前瞻的方法,例如r"(?<!\S)(?!\S*\b(?:map|api))\S*\bgoogle\b\S*"
,在其中你可以将黑名单术语添加到替代组中。 - Wiktor Stribiżewgoogle
之前的https?
和www
(可选)?并且只在空格之间?请参见此演示。 - Wiktor Stribiżew