Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解析_Python_Regex_Parsing_Text Parsing - Fatal编程技术网

Python解析

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

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

我之所以包含它,是因为,正如您所看到的,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)