带有特殊字符的Python正则表达式

时间:2014-06-16 15:49:53

标签: python regex string

无法编写强大的正则表达式来从字符串中获取信息。

$ string1 = 'A_XYZ_THESE_WORDS'
$ string2 = 'A_ABC_THOSE_WORDS'

我想要一个强大的解决方案,从string1或string2恭敬地推出' THESE_WORDS'或者' THOSE_WORDS'。

基本上,我需要在前两个下划线(_)之前删除所有内容的东西,但它们之前的文本会有所不同。

$ get_text = re.search('(?<=A_)\w+(_)',string1)
$ print get_text.group()
$ 'XYZ_THESE_'

3 个答案:

答案 0 :(得分:3)

根据您的问题陈述:

  

我需要在前两个下划线之前删除所有内容的东西

你不一定需要正则表达式:

>>> string1 = 'A_XYZ_THESE_WORDS'
>>> string1.split("_", 2)[2]
'THESE_WORDS'

str.split的第二个参数是要分割的最大次数。这将在前两个'_'上拆分,然后从结果列表中取出第三个项目(字符串的其余部分)。

如果字符串中的下划线少于两个,这将抛出IndexError - 这会让您知道字符串不是您期望的格式,但如果不希望出现这种情况,请考虑:

>>> string1 = 'A_XYZ_THESE_WORDS'
>>> string1.split("_", 2)[-1]
'THESE_WORDS'  

str.split获取列表中的 last 项,而不是假设有三个。比较:

>>> "JUST_ONE".split("_", 2)[2]
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    "JUST_ONE".split("_", 2)[2]
IndexError: list index out of range

>>> "JUST_ONE".split("_", 2)[-1]
'ONE'

答案 1 :(得分:1)

以下正则表达式将打印刚好在第二个下划线(_),

之后的文本
>>> import re
>>> string1 = 'A_XYZ_THESE_WORDS'
>>> string2 = 'A_ABC_THOSE_WORDS'
>>> m = re.search(r'^[^_]*_[^_]*_(.*)$', string1)
>>> m.group(1)
'THESE_WORDS'
>>> m = re.search(r'^[^_]*_[^_]*_(.*)$', string2)
>>> m.group(1)
'THOSE_WORDS'

答案 2 :(得分:1)

In [21]: regex = re.compile(r'^([a-zA-Z]+_){2}(.*)$')

In [22]: m = regex.search(string1)

In [23]: m.groups()
Out[23]: ('XYZ_', 'THESE_WORDS')

In [24]: m = regex.search(string2)

In [25]: m.groups()
Out[25]: ('ABC_', 'THOSE_WORDS')