Python解析

Ala*_*lan 4 python regex parsing text-parsing

我正在尝试将RSS 2.0提要中的标题标记解析为该提要中每个条目的三个不同变量.使用ElementTree我已经解析了RSS,这样我就可以)使用下面的代码打印每个标题[减去尾随]:

feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date")

for item in feed:  
 print repr(item.title[0:-1])
Run Code Online (Sandbox Code Playgroud)

我包括那个,因为你可以看到,item.title是一个repr()数据类型,我不太了解.

repr(item.title[0:-1]) print交互式窗口中的特定ed如下所示:

'randy travis (Billy Bobs 3/21'
'Michael Schenker Group (House of Blues Dallas 3/26'
Run Code Online (Sandbox Code Playgroud)

用户选择一个乐队,我希望在将每个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(逗号分隔)文件中包含所选条目,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我希望这不是太多问题.我会自己调查一下,以为我应该在这里发帖以确保它得到了答案.

所以,问题是,我该如何最好的分析每个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,他有一些很好的编辑.三个臭皮匠顶个诸葛亮!


Aar*_*paa 7

正则表达式是解决此问题的绝佳方法:

>>> 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)

请注意不同的报价样式.