提取<和>之间文本的正则表达式(Python)- 例如<stringone><string-two>等

1 投票
3 回答
1397 浏览
提问于 2025-04-16 04:07

我现在在玩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(而不是bestpractices)。另外,我用的是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的标签名称里没有包含<>,所以你可以使用这个正则表达式:

<(.*?)>

或者

<([^>]*)>

解释:

  • < : 代表一个字面意思的<
  • (..) : 用来分组和记住匹配的内容。
  • .*? : 用来匹配任何东西,但不会贪心地匹配,也就是说它会尽量少匹配。
  • > : 代表一个字面意思的>
  • [^>] : 一个字符类,用来匹配除了>以外的任何字符。

撰写回答