2024-04-19 06:56:57 发布
网友
我试图用RE来解析一个url字符串, 这是我的模式qid=(.*?)&+?它确实找到了查询字符串,但是如果在url的末尾没有&,那么它就失败了!在
qid=(.*?)&+?
&
请看一下pythex.org页,我在这里试图获得“qid”的查询字符串的值。在
我同意@alecxe的观点,即最好使用urlparse来处理。但是,这里有一些re选项。主要技巧是使用lookbehind、(?<=...)和lookahead、(?=...)断言。在
urlparse
re
(?<=...)
(?=...)
一般的模式是:返回后面有“qid=”的内容,前面是零或一个“&;':'(?<=qid=)somepattern(?=&)?'
'(?<=qid=)
(?=&)?'
如果您单独禁用了这个变量的值,那么?<;=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)
运行此打印:
您可以(也许应该)用^{}来解决它:
>>> from urlparse import urlparse, parse_qs >>> s = "https://xx.com/question/index?qid=2ss2830AA38Wng" >>> parse_qs(urlparse(s).query)['qid'][0] '2ss2830AA38Wng'
对于正则表达式方法,您可以检查是否存在&或字符串的结尾:
(?:...)这是一个非捕获组。在
(?:...)
我同意@alecxe的观点,即最好使用
urlparse
来处理。但是,这里有一些re
选项。主要技巧是使用lookbehind、(?<=...)
和lookahead、(?=...)
断言。在一般的模式是:返回后面有“qid=”的内容,前面是零或一个“&;':
'(?<=qid=)
somepattern(?=&)?'
如果您单独禁用了这个变量的值,那么?<;=qid=)([^&;]*)(?=&;)?'在
但是,如果必须使用多行模式,则还需要避免匹配换行符。假设它是'\n'(但是当然,不同的编码使用不同的换行符)。那么你可以用:'(?<;=qid=)([^&;\n]*)(?=&;)?'在
最后,如果您确定qid变量只存储字母数字值,那么就可以避免换行符的不确定性,只匹配字母数字值:'(?<;=qid=)([A-Za-z0-9]*)(?=&;)?'在
运行此打印:
^{pr2}$您可以(也许应该)用^{} 来解决它:
对于正则表达式方法,您可以检查是否存在
^{pr2}$&
或字符串的结尾:(?:...)
这是一个非捕获组。在相关问题 更多 >
编程相关推荐