提取<和>之间文本的正则表达式(Python)- 例如<stringone><string-two>等
我现在在玩Stack Overflow的数据备份,想写一个简单的正则表达式,用来提取尖括号<
和>
之间的标签名。也就是说,对于每个问题,我有一个或多个标签的列表,比如<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,如果这有什么影响的话。有什么建议吗?
3 个回答
2
这里有一个简单粗暴的解决办法:
#!/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解析器来处理。
3
与其进行数据转储(不管那是什么)并使用正则表达式,你可能更想用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']
3
因为Stackoverflow的标签名称里没有包含<
和>
,所以你可以使用这个正则表达式:
<(.*?)>
或者
<([^>]*)>
解释:
<
: 代表一个字面意思的<
(..)
: 用来分组和记住匹配的内容。.*?
: 用来匹配任何东西,但不会贪心地匹配,也就是说它会尽量少匹配。>
: 代表一个字面意思的>
[^>]
: 一个字符类,用来匹配除了>
以外的任何字符。