正则表达式:我想在特定字符之后匹配多个单词(例如'?')。匹配的字符串将在任何位置和任何顺序

时间:2018-09-21 06:55:26

标签: regex

curl -vL http://www.yyyy.com/index.html?event_id=100&stream_id&vbegin&vend&p&fps&m&f&cc&mta&channel&outlet&plang&fs=10

这是我的网址。我想在一个字符('?')之后匹配event_id,fs,stream_id(这些是参数)字符串,并且我想使用正则表达式删除其余参数。但网址可能会

curl -vL http://www.yyyy.com/index.html?vbegin=100&&vend&p&fps&m&event_id=10&fs=10

also.parameters将以任何顺序排列或可能不存在。因此,我想匹配给定的参数,如果它存在,则不执行任何操作。然后,我需要删除其余的参数及其值。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

import re
s='http://www.yyyy.com/index.html? 
event_id=100&stream_id&vbegin&vend&p&fps&m&f&cc&mta&channel&outlet&plang&fs=10'
args=re.sub("(.*)\\?(.*)","\\2",s)
EVENT_PAT = ".*event_id=(\d+).*"
eventpat=re.compile(EVENT_PAT)
event_id = eventpat.match(args).group(1)
FS_PAT = ".*fs=(\d+).*"
fspat = re.compile(FS_PAT)
fs_id = fspat.match(args).group(1)

尽管这不是最佳解决方案,但它应该可以工作。您也可以尝试用&分割args并遍历列表,再用'='分割,使其像键/值对并访问任何键。

list_args = args.split('&')
hm={}
for args in list_args:
    if len(args.split("="))>1: hm[args.split("=")[0]]=args.split("=")[1]
print(hm)

答案 1 :(得分:0)

下面的perl解决方案如何:

> export URL="curl -vL http://www.yyyy.com/index.html?event_id=100&stream_id&vbegin&vend&p&fps&m&f&cc&mta&channel&outlet&plang&fs=10"
> perl -pe 'BEGIN {$x=$ENV{URL};@reqd=("event_id=","stream_id","fs=");foreach $url (@reqd) { if($x=~m/$url([^&]*)(\&|$)/sm) {print "$&\n"}}exit}'
event_id=100&
stream_id&
fs=10
> export URL="curl -vL http://www.yyyy.com/index.html?vbegin=100&&vend&p&fps&m&event_id=10&fs=10"
> perl -pe 'BEGIN {$x=$ENV{URL};@reqd=("event_id=","stream_id","fs=");foreach $url (@reqd) { if($x=~m/$url([^&]*)(\&|$)/sm) {print "$&\n"}}exit}'
event_id=10&
fs=10
>