python中使用正则表达式解析查询字符串

2024-04-19 06:56:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用RE来解析一个url字符串, 这是我的模式qid=(.*?)&+?它确实找到了查询字符串,但是如果在url的末尾没有&,那么它就失败了!在

请看一下pythex.org页,我在这里试图获得“qid”的查询字符串的值。在


Tags: 字符串orgreurl模式末尾qid试图用
2条回答

我同意@alecxe的观点,即最好使用urlparse来处理。但是,这里有一些re选项。主要技巧是使用lookbehind、(?<=...)和lookahead、(?=...)断言。在

一般的模式是:返回后面有“qid=”的内容,前面是零或一个“&;':'(?<=qid=)somepattern(?=&)?'

如果您单独禁用了这个变量的值,那么?<;=qid=)([^&;]*)(?=&;)?'在

但是,如果必须使用多行模式,则还需要避免匹配换行符。假设它是'\n'(但是当然,不同的编码使用不同的换行符)。那么你可以用:'(?<;=qid=)([^&;\n]*)(?=&;)?'在

最后,如果您确定qid变量只存储字母数字值,那么就可以避免换行符的不确定性,只匹配字母数字值:'(?<;=qid=)([A-Za-z0-9]*)(?=&;)?'在

import re

# Single line version
s_1 = 'https://xx.com/question/index?qid=2ss2830AA38Wng'
s_2 = 'https://xx.com/question/index?qid=2ff38Wng&a=aubb&d=ajfbjhcbha'
q_1 = '(?<=qid=)([^&]*)(?=&)?'

print re.findall(q_1, s_1)
print re.findall(q_1, s_2)

# Multiline version V1
s_m = s_1 + '\n' + s_2
q_m = '(?<=qid=)([^&\n]*)(?=&)?'

print re.findall(q_m, s_m)

# Multiline version V2
q_m_2 = '(?<=qid=)([A-Za-z0-9]*)(?=&)?'

print re.findall(q_m_2, s_m)

运行此打印:

^{pr2}$

您可以(也许应该)用^{}来解决它:

>>> from urlparse import urlparse, parse_qs
>>> s = "https://xx.com/question/index?qid=2ss2830AA38Wng"
>>> parse_qs(urlparse(s).query)['qid'][0]
'2ss2830AA38Wng'

对于正则表达式方法,您可以检查是否存在&或字符串的结尾:

^{pr2}$

(?:...)这是一个非捕获组。在

相关问题 更多 >