Ala*_*lan 4 python regex parsing text-parsing
我正在尝试将RSS 2.0提要中的标题标记解析为该提要中每个条目的三个不同变量.使用ElementTree我已经解析了RSS,这样我就可以)
使用下面的代码打印每个标题[减去尾随]:
Run Code Online (Sandbox Code Playgroud)feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date") for item in feed: print repr(item.title[0:-1])
我包括那个,因为你可以看到,item.title是一个repr()数据类型,我不太了解.
repr(item.title[0:-1])
print
交互式窗口中的特定ed如下所示:
Run Code Online (Sandbox Code Playgroud)'randy travis (Billy Bobs 3/21' 'Michael Schenker Group (House of Blues Dallas 3/26'
用户选择一个乐队,我希望在将每个item.title
变量解析成3个变量(每个变量为一个变量,一个地点和一个日期......或者可能是一个数组或我不知道......)时,只选择与乐队相关的变量选择.然后他们被发送到谷歌进行地理编码,但这是另一个故事.
我已经看过一些例子,regex
我正在阅读它们,但它看起来很复杂.是吗?我想也许这里有人会对如何以智能方式做到这一点有一些见解.我应该使用该re
模块吗?输出当前是repr()
s 是否重要?有没有更好的办法?我以为我会使用一个循环(这是我的pseudoPython,只是我写的一些注释):
list = bandRaw,venue,date,latLong for item in feed: parse item.title for bandRaw, venue, date if bandRaw == str(band) send venue name + ", Dallas, TX" to google for geocoding return lat,long list = list + return character + bandRaw + "," + venue + "," + date + "," + lat + "," + long else
最后,我需要在.csv(逗号分隔)文件中包含所选条目,如下所示:
Run Code Online (Sandbox Code Playgroud)band,venue,date,lat,long randy travis,Billy Bobs,3/21,1234.5678,1234.5678 Michael Schenker Group,House of Blues Dallas,3/26,4321.8765,4321.8765
我希望这不是太多问题.我会自己调查一下,以为我应该在这里发帖以确保它得到了答案.
所以,问题是,我该如何最好的分析每个repr(item.title[0:-1])
在feed
成3个独立的价值观,我可以再连接成一个.csv文件?
Jar*_*die 17
不要让正则表达式吓跑你......这非常值得学习.
鉴于上面的示例,您可以尝试重新插入尾部括号,然后使用此模式:
import re
pat = re.compile('([\w\s]+)\(([\w\s]+)(\d+/\d+)\)')
info = pat.match(s)
print info.groups()
('Michael Schenker Group ', 'House of Blues Dallas ', '3/26')
Run Code Online (Sandbox Code Playgroud)
要获得每个组的个人,只需在info
对象上调用它们:
print info.group(1) # or info.groups()[0]
print '"%s","%s","%s"' % (info.group(1), info.group(2), info.group(3))
"Michael Schenker Group","House of Blues Dallas","3/26"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正则表达式的难点在于确保您知道标题中所有已知的可能字符.如果'Michael Schenker Group'部分中存在非alpha字符,则必须调整该部分的正则表达式以允许它们.
上面的模式分解如下,从左到右解析:
([\w\s]+)
:匹配任何单词或空格字符(加号表示应该有一个或多个这样的字符).括号表示匹配将作为一组捕获.这是"迈克尔·辛克集团"的一部分.如果此处可以有数字和短划线,则您需要修改方括号之间的部分,这些部分是集合的可能字符.
\(
:一个字面括号.反斜杠会转义括号,因为否则它将被视为正则表达式命令.这是"("字符串的一部分.
([\w\s]+)
:与上面的相同,但这一次与"House of Blues Dallas"相匹配.在括号中,它们将被捕获为第二组.
(\d+/\d+)
:匹配数字3和26,中间有斜杠.在括号中,它们将被捕获为第三组.
\)
:上面的结束括号.
正则表达式的python介绍非常好,你可能想花一个晚上来讨论http://docs.python.org/library/re.html#module-re.另外,请查看Dive Into Python,它有一个友好的介绍:http://diveintopython3.ep.io/regular-expressions.html.
编辑:请参阅下面的zacherates,他有一些很好的编辑.三个臭皮匠顶个诸葛亮!
正则表达式是解决此问题的绝佳方法:
>>> import re
>>> s = 'Michael Schenker Group (House of Blues Dallas 3/26'
>>> re.match(r'(.*) \((.*) (\d+/\d+)', s).groups()
('Michael Schenker Group', 'House of Blues Dallas', '3/26')
Run Code Online (Sandbox Code Playgroud)
作为旁注,您可能希望查看Universal Feed Parser来处理RSS解析,因为Feed有一个不正确的习惯.
编辑
关于你的评论...偶尔包含在"s而不是s"中的字符串与你使用repr的事实有关.字符串的repr通常用's限定,除非该字符串包含一个或者更多,相反,它使用"s,以便不必逃脱:
>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"
Run Code Online (Sandbox Code Playgroud)
请注意不同的报价样式.