我目前正在处理堆栈溢出数据转储,并试图构造一个简单的正则表达式,从<和>字符中提取标记名。因此,对于每个问题,我都有一个或多个标签的列表,比如<tagone><tag-two>...<tag-n>,并试图只提取一个标签名的列表。下面是从数据转储中获取的几个示例标记字符串:
<javascript><internet-explorer>
<c#><windows><best-practices><winforms><windows-services>
<c><algorithm><sorting><word>
<java>作为参考,我不需要将标记名划分为单词,因此,对于<best-practices>这样的例子,我想返回best-practices (而不是best和practices)。此外,不管它有什么价值,如果它有任何不同,我都会使用Python。有什么建议吗?
发布于 2010-09-14 11:34:28
由于Stackoverflow的标记名没有嵌入的< >,所以可以使用regex:
<(.*?)>或
<([^>]*)>解释:
<:文字<(..):对match..*?进行分组和记忆:以匹配非贪婪的way.>中的任何内容:文字<[^>]:char类与>以外的任何内容匹配。
发布于 2010-09-14 12:11:20
与其做数据转储(不管它们是什么)和使用regex,您可能对使用Stackoverflow API和json感兴趣。
例如,要从这个问题中选择标记,可以这样做:
import urllib2
import json
import gzip
import cStringIO
f=urllib2.urlopen('http://api.stackoverflow.com/1.0/questions/3708418?type=jsontext')
g=gzip.GzipFile(fileobj=cStringIO.StringIO(f.read()))
j=json.loads(g.read())
print(j['questions'][0]['tags'])
# [u'python', u'regex']发布于 2010-09-14 11:35:06
下面是一个快速而肮脏的解决方案:
#!/usr/bin/python
import re
pattern = re.compile("<(.*?)>")
data = """
<javascript><internet-explorer>
<c#><windows><best-practices><winforms><windows-services>
<c><algorithm><sorting><word>
<java>
"""
for each in pattern.findall(data):
print each更新
法定警告:如果数据转储使用的是XML或JSON (正如其中一位用户所评论的),那么您最好使用合适的XML或JSON解析器。
https://stackoverflow.com/questions/3708418
复制相似问题