无法编写强大的正则表达式来从字符串中获取信息。
$ 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_'
答案 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')