【发布时间】:2009-08-16 17:08:16
【问题描述】:
是否有一种简单的方法可以从给定字符串中删除与给定正则表达式匹配的所有字符?我知道在 Ruby 中我可以使用 gsub:
>> key = "cd baz ; ls -l"
=> "cd baz ; ls -l"
>> newkey = key.gsub(/[^\w\d]/, "")
=> "cdbazlsl"
Python 中的等效函数是什么?
【问题讨论】:
是否有一种简单的方法可以从给定字符串中删除与给定正则表达式匹配的所有字符?我知道在 Ruby 中我可以使用 gsub:
>> key = "cd baz ; ls -l"
=> "cd baz ; ls -l"
>> newkey = key.gsub(/[^\w\d]/, "")
=> "cdbazlsl"
Python 中的等效函数是什么?
【问题讨论】:
import re
re.sub(pattern, '', s)
【讨论】:
到目前为止,答案都集中在与您的 Ruby 代码做同样的事情上,这与您在问题的英文部分中所问的完全相反:代码删除了匹配的字符,而您的文本询问对于
删除所有字符的简单方法 从给定的字符串匹配失败
例如,假设您的 RE 的模式是 r'\d{2,}',“两位或多位数字”——因此不匹配的部分将是所有非数字加上所有单个、孤立的数字。根据您的文本要求删除不匹配的部分也很容易:
>>> import re
>>> there = re.compile(r'\d{2,}')
>>> ''.join(there.findall('123foo7bah45xx9za678'))
'12345678'
编辑:好的,OP 现在澄清了这个问题(他确实是说他的代码,而不是他的文字,现在文字也是正确的;-)但我要离开回答完整性(建议re.sub 的其他答案对于现在的问题是正确的)。
我意识到您可能是指您在 Ruby 代码中“说”的内容,而不是您在英文文本中说的内容,但是,以防万一,我想我最好完成这组答案!-)
【讨论】:
import re
old = "cd baz ; ls -l"
regex = r"[^\w\d]" # which is the same as \W btw
pat = re.compile( regex )
new = pat.sub('', old )
【讨论】:
re.subn()是你的朋友:
>>> import re
>>> key = "cd baz ; ls -l"
>>> re.subn(r'\W', "", key)
('cdbazlsl', 6)
>>> re.subn(r'\W', "", key)[0]
'cdbazlsl'
返回一个元组。如果您只想要结果字符串,请取第一个元素。或者只是调用 re.sub(),正如 SilentGhost 所说。 (也就是说,他的回答更准确。)
【讨论】:
可能是最短的方式:
In [32]: pattern='[-0-9.]'
....: price_str="¥-607.6B"
....: ''.join(re.findall(pattern,price_str))
Out[32]: '-607.6'
【讨论】: