我想在文本文件中解析URI / L's中的参数和关键字值。还应包括没有值的参数。 Python很好但是我可以使用Perl等其他工具或者也可以使用其他工具来提示。
示例来源:
www.domain.com/folder/page.php?date=2012-11-20
www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text=
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//support.domain.com/downloads/index.asp&unique=12345
blog.news.org/news/calendar.php?view=month&date=2011-12-10
示例输出:
date=2012-11-20
l=user
x=0
page=http%3A//domain.com/page.html&unique=123456
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname
test=
l=adm
y=5
id=2
page=http%3A//support.domain.com/downloads/index.asp
unique=12345
view=month
date=2011-12-10
答案 0 :(得分:5)
你不需要潜入脆弱的正则表达世界。
urlparse.parse_qsl()
是工作的工具(urllib.quote()
有助于逃避特殊字符):
from urllib import quote
from urlparse import parse_qsl, urlparse
with open('links.txt') as f:
for url in f:
params = parse_qsl(urlparse(url.strip()).query, keep_blank_values=True)
for key, value in params:
print "%s=%s" % (key, quote(value))
打印:
date=2012-11-20
l=user
x=0
id=1
page=http%3A//domain.com/page.html
unique=123456
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob%20test%201.21%20some%26file%3Dname
text=
l=adm
y=5
id=2
page=http%3A//support.domain.com/downloads/index.asp
unique=12345
view=month
date=2011-12-10
希望有所帮助。
答案 1 :(得分:-1)
我会使用这样的正则表达式(第一个代码然后解释):
pairs = re.findall(r'(\w+)=(.*?)(?:\n|&)', s, re.S)
for k, v in pairs:
print('{0} = {1}'.format(k, v))
第一行是行动发生的地方。正则表达式查找所有出现的单词后跟一个等号,然后是一个字符串,它由&
或新行char终止。返回pairs
是一个元组列表,其中每个元组包含单词(关键字)和值。我没有捕获=
符号,而是将其打印在循环中。
解释正则表达式:
\w+
表示一个或多个单词字符。它周围的括号表示捕获它并返回该值。
=
- 必须遵循
.*?
- 以非贪婪的方式显示零个或多个字符,直到出现新行或&
符号,由\n|&
指定。 (?:..
模式意味着不应捕获\n
或&
。
由于我们在正则表达式中捕获了2个内容 - 关键字以及=
符号后的所有内容,因此返回了2个元组的列表。
re.S
告诉正则表达式引擎允许匹配所有正则表达式代码 - .
- 在搜索中包括新行char,也就是说,允许搜索跨越多行(这不是默认行为。)
答案 2 :(得分:-2)
您可以使用正则表达式提取所有对。
>>> url = 'www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text='
>>> import re
>>> url = 'www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text='
>>> p = re.compile('.*?&(.*?)=(.*?)(?=&|$)')
>>> m = p.findall(url)
>>> m
[('x', '0'), ('id', '1'), ('page', 'http%3A//domain.com/page.html'), ('unique', '123456'), ('refer', 'http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname'), ('text', '')]
您甚至可以使用dict理解将所有数据打包在一起。
>>> dic = {k:v for k,v in m}
>>> dic
{'text': '', 'page': 'http%3A//domain.com/page.html', 'x': '0', 'unique': '123456', 'id': '1', 'refer': 'http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname'}
然后,如果你想要做的就是将它们打印出来:
>>> for k,v in dic.iteritems():
print k,'-->',v
text -->
page --> http%3A//domain.com/page.html
x --> 0
unique --> 123456
id --> 1
refer --> http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname