我知道还有很多其他的正则表达式问题,但我希望有人可以指出我的正则表达式有什么问题。我已经对它进行了一些研究,它看起来应该有效。我使用rubular来测试它,是的我知道这是ruby的正则表达式,但我使用的相同规则应该适用于python docs
中的python目前我有
a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
c = [re.sub(r'[A-Z]+', "", x) for x in a]
返回
['SDFSD_SFSDF', 'SDFSDF_SDFSDF_', 'TSFSD_SDF_']
但我希望它返回
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']
我尝试使用这个正则表达式
c = [re.sub(r'$?_[^A-Z_]+', "", x) for x in a]
但我收到此错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/re.py", line 151, in sub
return _compile(pattern, 0).sub(repl, string, count)
File "/usr/lib64/python2.6/re.py", line 245, in _compile
raise error, v # invalid expression
任何人都可以帮我弄清楚我做错了吗?
答案 0 :(得分:1)
import re
a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
c = [re.match(r'[A-Z_]+[A-Z]', x).group() for x in a]
print c
结果:
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']
请注意,您在示例中使用的“re.sub”是正则表达式替换命令,而不是搜索。你的正则表达式似乎与你要求的东西相匹配,而不是你想要摆脱你想要的东西。
答案 1 :(得分:1)
您可以在正则表达式中插入'lookahead'。
写为(?=...)
,你的正则表达式只匹配文字,后跟你放在…
中的任何内容。
因此,在您的情况下,您可以选择忽略下划线,除非后跟[A-Z]
。
您的reg exp将如下所示:r'[A-Z]+_(?[A-Z])'
因此,不会被字母后跟的下划线将被忽略。
答案 2 :(得分:1)
没有正则表达式使用rstrip
:
a = ["ends_with_underscore_", "does_not", "multiple_____"]
b = [ x.rstrip("_") for x in a]
print b
>> ['ends_with_underscore', 'does_not', 'multiple']
答案 3 :(得分:1)
>>> import re
>>> a = ["SDFSD_SFSDF234234","SDFSDF_SDFSDF_234324","TSFSD_SDF_213123"]
>>> c = [re.sub('_?\d+','',x) for x in a]
>>> c
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']
>>>
它简短而简单。基本上,它是说“替换所有数字流或数字流,前面带有_”。
答案 4 :(得分:0)
错误:
c = [re.sub(r'$?_[^A-Z_]+', "", x) for x in a]
由?
引起,它前面没有任何字符,所以它不知道匹配0或1次的内容。如果您将其更改为:
>>> [re.sub(r'_?[^A-Z_]+$', "", x) for x in a]
['SDFSD_SFSDF', 'SDFSDF_SDFSDF', 'TSFSD_SDF']
它按预期工作。
另一件事,$
用于引爆该行的结尾,因此它可能不应该是第一个字符。