簡體   English   中英

使用正則表達式按照特定模式提取多個字符串

[英]use regex to extract multiple strings following certain pattern

我有一個像這樣的長字符串,我想提取Invalid items之后的所有項目,所以我希望正則表達式返回一個列表,如['abc.def.com', 'bar123', 'hello', 'world', '1212', '5566', 'aaaa']

我嘗試使用這種模式,但每場比賽給我一組

import re
test = 'Valid items: (aaa.com; bbb.com); Invalid items: (abc.def.com;); Valid items: (foo123;); Invalid items: (bar123;); Valid items: (1234; 5678; abcd;); Invalid items: (hello; world; 1212; 5566; aaaa;)'
re.findall(r'Invalid items: \((.+?);\)', test)
# ['abc.def.com', 'bar123', 'hello; world; 1212; 5566; aaaa']

有沒有更好的方法用正則表達式來做到這一點?

謝謝

如果您想僅使用一個findall單獨返回所有匹配項,那么您需要使用積極的后視,例如(?<=foo) 不幸的是, re模塊僅支持固定寬度的后視。 但是,如果您願意使用出色的正則表達式模塊,那么它可以完成。

正則表達式:

(?<=Invalid items: \([^)]*)[^ ;)]+

演示: https://regex101.com/r/p90Z81/1

如果可能有空項,則對正則表達式稍作修改即可捕獲這些零寬度匹配項,如下所示:

(?<=Invalid items: \([^)]*)(?:[^ ;)]+|(?<=\(| ))

使用re ,您可以將匹配的組拆分為分號和空格

import re
test = 'Valid items: (aaa.com; bbb.com); Invalid items: (abc.def.com;); Valid items: (foo123;); Invalid items: (bar123;); Valid items: (1234; 5678; abcd;); Invalid items: (hello; world; 1212; 5566; aaaa;)'
results = []
for s in re.findall(r'Invalid items: \((.+?);\)', test):
     results = results + s.split(r"; ")

print(results)

Output

['abc.def.com', 'bar123', 'hello', 'world', '1212', '5566', 'aaaa']

請參閱Python 演示

這將僅選擇有效或無效中提到的所需模式

import re
test = 'Valid items: (abc.h; bac.h); Invalid items: (aaa.123;); Valid items: (aaa H;bbbb H;); Invalid items: (abc;bac;)'
results = []
for s in re.findall(r'Invalid items: \((.+?);\)', test):
     results = results + s.split(r" ; ")
 
print(results)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM