想要使用正则表达式提取字符串

时间:2011-12-06 06:59:34

标签: python regex

我的字符串就像[[English language|English]]一样。我试图从字符串中提取文本。但没有运气。我只是想忽略文字[[English language|。输出应为English

另一个例子: [[Stack Exchange|Question]]输出应仅为Question

如果没有|

[[Stack Exchange]]然后输出应该只有Stack Exchange

我是regex的新手。你能帮帮我吗?非常感谢你

2 个答案:

答案 0 :(得分:1)

这个正则表达式会做到。

^\[\[(?:.*?\|)?(.*?)?\]\]$

RegExr

第一个捕获组将包含您想要的文本。

答案 1 :(得分:1)

这可以在没有正则表达式的情况下完成

>>> text="[[English language|English]]"
>>> text.strip("[]").split("|")[-1]
'English'
>>> text="[[Stack Exchange|Question]]"
>>> text.strip("[]").split("|")[-1]
'Question'
>>> text="[[Stack Exchange]]"
>>> text.strip("[]").split("|")[-1]
'Stack Exchange'

注意,首先从两端剥去所有“[”和“]”,然后用“|”拆分字符串作为分隔符。返回列表中的最后一项。

使用Regex

>>> text="[[English language|English]]"
>>> re.findall("([^\[\]\|]+)",text)[-1]
'English'
>>> text="[[Stack Exchange|Question]]"
>>> re.findall("([^\[\]\|]+)",text)[-1]
'Question'
>>> text="[[Stack Exchange]]"
>>> re.findall("([^\[\]\|]+)",text)[-1]
'Stack Exchange'
>>> 

如果未找到匹配项,则会生成索引错误:所以我们可以进行以下修改

try:
   result=text.strip("[]").split("|")[-1]
except IndexError:
   None #or what ever you intend to have here

try:
    result=re.findall("([^\[\]\|]+)",text)[-1]
except IndexError:
   None #or what ever you intend to have here

效果比较

>>> stmt1="""
import re
text="[[English language|English]]"
try:
    result=re.findall("([^\[\]\|]+)",text)[-1]
except IndexError:
    None
"""
>>> stmt2="""
text="[[English language|English]]"
try:
    result=text.strip("[]").split("|")[-1]
except IndexError:
    None
"""
>>> import timeit
>>> t1=timeit.Timer(stmt=stmt1)
>>> t2=timeit.Timer(stmt=stmt2)
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
4.89 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
1.43 usec/pass
>>>