Python解析
我试图将RSS 2.0提要中的title标记解析为该提要中每个条目的三个不同变量。我已经使用ElementTree解析了RSS,这样我就可以用下面的代码打印每个标题[减去尾随的Python解析,python,regex,parsing,text-parsing,Python,Regex,Parsing,Text Parsing,我试图将RSS 2.0提要中的title标记解析为该提要中每个条目的三个不同变量。我已经使用ElementTree解析了RSS,这样我就可以用下面的代码打印每个标题[减去尾随的)] 我之所以包含它,是因为,正如您所看到的,item.title是一种repr()数据类型,对此我了解不多 交互式窗口中的特定repr(item.title[0:-1])printed如下所示: import geocoders # from GeoPy us = geocoders.GeocoderDotUS() i
)
]
我之所以包含它,是因为,正如您所看到的,item.title是一种repr()数据类型,对此我了解不多
交互式窗口中的特定repr(item.title[0:-1])
print
ed如下所示:
import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()
import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)
lines = []
for entry in feed.entries:
m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)
if m:
bandRaw, venue, date = m.groups()
if band == bandRaw:
place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
lines.append(",".join([band, venue, date, lat, lng]))
result = "\n".join(lines)
用户选择一个波段,我希望在解析每个项目后,将title
分为3个变量(波段、地点和日期各一个变量…或者可能是一个数组或我不知道…),仅选择与所选波段相关的变量。然后它们被发送到谷歌进行地理编码,但那是另一回事了
我已经看到了一些regex
的例子,我正在阅读它们,但它似乎非常复杂。它是?我想也许这里有人会对如何以智能的方式做到这一点有一些见解。我应该使用re
模块吗?输出当前为repr()
s是否重要?有更好的办法吗?我想我应该使用一个循环(这是我的伪Python,我正在写的注释):
我希望这不是太多的要求。我会自己调查的,只是觉得我应该在这里张贴,以确保它得到答复
因此,问题是,如何最好地将
提要中的每个repr(item.title[0:-1])
解析为3个单独的值,然后连接到一个.csv文件中?不要让regex吓跑你。。。这很值得学习
鉴于上述示例,您可以尝试将后面的括号放回,然后使用以下模式:
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')
要找到每个组的个人,只需在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"
在本例中,正则表达式的难点在于确保您知道标题中所有已知的可能字符。如果“Michael Schenker Group”部分中存在非alpha字符,则必须调整该部分的正则表达式以允许它们
上面的模式分解如下,从左到右解析:
([\w\s]+)
:匹配任何单词或空格字符(加号表示应该有一个或多个这样的字符)。括号表示匹配将作为一个组捕获。这是“迈克尔·申克集团”的一部分。如果此处可能有数字和破折号,则需要修改方括号之间的片段,这是集合的可能字符
\(
:文字括号。反斜杠转义括号,否则它将被视为regex命令。这是字符串的“(”部分
([\w\s]+)
:与上述内容相同,但这次与“布鲁斯之家达拉斯”部分匹配。括号中的内容将作为第二组内容捕获
<代码>(\D+/\D+)< /代码>:将数字3和26与中间的斜线相匹配。在括号中,它们将被捕获为第三组。
\)
:上面的右括号
regex的python介绍非常好,您可能想花一个晚上来复习一下。另外,请检查一下python,它有一个友好的介绍:
编辑:见下面的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')
作为补充说明,您可能希望了解处理RSS解析的方法,因为提要有格式错误的坏习惯
编辑
关于您的评论…字符串偶尔被包装为“s”而不是“s”与您正在使用repr这一事实有关。字符串的repr通常用“s”分隔,除非该字符串包含一个或多个“s”,而它使用“s”,这样就不必转义“s”:
>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"
请注意不同的引用样式。关于repr(item.title[0:-1])
部分,不确定从何处获得,但我非常确定您可以简单地使用item.title
。您所做的只是从字符串中删除最后一个字符,然后对其调用repr()
,这没有任何作用
您的代码应该如下所示:
import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()
import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)
lines = []
for entry in feed.entries:
m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)
if m:
bandRaw, venue, date = m.groups()
if band == bandRaw:
place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
lines.append(",".join([band, venue, date, lat, lng]))
result = "\n".join(lines)
编辑:将列表
替换为行
作为变量名。列表
是内置的,不应用作变量名。对不起。谢谢你的回答!这很有帮助!不过我有点困惑…我需要单独识别字段发送到Google并连接。如何调用每个v值?例如,我如何连接值?您的正则表达式在乐队和场馆名称上留下尾随空格,但这很容易修复。是的,我也注意到了这一点,但我想我只需在每个项目的前两个值上使用[0:-1]
技巧。title
。以及他对(.*)的搜索解决了字符问题,只要你不将regex设置为greedyI,我就用一些连接信息编辑了这篇文章…希望我正确理解了你的意图。谢谢你的回答!至于你的旁注,我注意到有些条目带有“”在开头和结尾,而不是“”。我不知道这是否会是一个问题。我使用的RSS解析器位于::::::看起来你用的行数比导入的少…你使用的是什么模块?特别是get_geo和list.append?list是一个内置的,对吗?get_geo?是GeoPy提供的吗?最后一个line添加换行符?这也很有帮助。感谢您花时间。如果不清楚,很抱歉,但我编造了get_geo。我只是将它用作您决定实现的任何函数的占位符。
>>> 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')
>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"
import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()
import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)
lines = []
for entry in feed.entries:
m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)
if m:
bandRaw, venue, date = m.groups()
if band == bandRaw:
place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
lines.append(",".join([band, venue, date, lat, lng]))
result = "\n".join(lines)