Python 用于有条件提取命名组的正则表达式
我需要编写python风格的正则表达式来有条件地提取字段。以下是我需要从中提取的两种类型的测试字符串:Python 用于有条件提取命名组的正则表达式,python,regex,Python,Regex,我需要编写python风格的正则表达式来有条件地提取字段。以下是我需要从中提取的两种类型的测试字符串: http://domain/string1/path/field_to_extract/path/filename http://domain/string2/path/90020_10029/path/filename 以下是我的要求: 对于string2,我们应该只选择第四个位置的数字,在斜杠(/)和(41;之间 对于其他人,我们应该在第四个位置的斜杠(/)之间选择整个文本 我编写了
http://domain/string1/path/field_to_extract/path/filename
http://domain/string2/path/90020_10029/path/filename
以下是我的要求:
(?i)^(?:[^ ]*(?: {1,2})){6}(?:[a-z]+://)(?:[^ /:]+[^ /]/:]+[^ /]+/[^ /]+/)?(?:[^ /]+/){2}(?P<field_name>(?<=/string2/)(?:[^/]+/)([^_]+)|((?<!/string2/)(?:[^/]+/)([^/]+)))
(?i)^(?:[^]*(?:{1,2})){6}(?[a-z]+://)(?:[^/:]+[^/]/:]+[^/]+/[^/]+/)?(?:[^/]+/){2}(?P(?)?
尽管条件提取似乎工作正常,但此正则表达式也与提取字段之前的字符串匹配。例如,在第一个测试字符串上使用时,此正则表达式与path/field_to_extract
匹配,在第二个测试字符串上与path/90020
匹配
虽然我在必填字段之前向组中添加了ignore,但它似乎不起作用
请帮助我正确使用正则表达式。使用split()
而不是complegex如何:-
s = 'thelink'.split('/')
if len(s) > 4:
string1or2 = s[3]
field = s[5]
if string1or2 == 'string2':
print field.split('_')[0]
else:
raise ValueError("Incorrect URL")
尝试使用模式'/[^/]+/[^/]+/[^/]+/(\d+(?=)|[^/]+)”
纯正则表达式解决方案:
import re
urls = [
r'''http://domain/string1/path/field_to_extract/path/filename''',
r'''http://domain/string2/path/90020_10029/path/filename'''
]
for url in urls:
print(re.search(r'(?<![:/])/(?:(string2)|[^/]*)/[^/]*/((?(1)[^_]*|[^/]*))', url).group(2))
你也可以在第二种情况下使用split。我已经编辑了你的脚本,以避免出现一些异常(例如,id链接不包含斜杠),谢谢@Eric.EditedTanks的回答edit@Maximelrant。以前从未见过有人这么麻烦:)你可以将[^/]+/[^/]+/[^/]+/
简化为(?:[^/]+/]{3}
field_to_extract
90020