Python - 使用正则表达式过滤数据

时间:2009-08-16 17:08:17

标签: python regex

是否有一种简单的方法可以删除给定字符串中与给定正则表达式匹配的所有字符?我知道在Ruby中我可以使用gsub

>> key = "cd baz ; ls -l"
=> "cd baz ; ls -l"
>> newkey = key.gsub(/[^\w\d]/, "")
=> "cdbazlsl"

Python中的等效函数是什么?

5 个答案:

答案 0 :(得分:13)

import re
re.sub(pattern, '', s)

Docs

答案 1 :(得分:5)

到目前为止,答案主要集中在做与Ruby代码相同的事情,这与您在问题的英文部分中所提出的内容完全相反:代码删除了DO匹配的字符,而文本要求对

  

删除所有字符的简单方法   来自无法匹配的给定字符串

例如,假设您的RE模式为r'\d{2,}',“两位或更多位” - 因此不匹配的部分将是所有非数字加上所有单个孤立的数字。按照文本要求删除不匹配的部分也很简单:

>>> import re
>>> there = re.compile(r'\d{2,}')
>>> ''.join(there.findall('123foo7bah45xx9za678'))
'12345678'

编辑:好的,OP现在澄清了这个问题(他确实意味着他的代码,而不是他的文字说,现在文本也是正确的;-)但我要离开了回答完整性(其他答案表明re.sub对于现在的问题是正确的)。 我意识到你可能意味着你在Ruby代码中“说”了什么,而不是你在英文文本中所说的,但是,为了以防万一,我认为我最好完成答案集! - )

答案 2 :(得分:2)

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所述。 (也就是说,他的答案更准确。)

答案 3 :(得分:2)

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 )

答案 4 :(得分:0)

可能是最短路:

In [32]: pattern='[-0-9.]'
   ....: price_str="¥-607.6B"
   ....: ''.join(re.findall(pattern,price_str))
Out[32]: '-607.6'
相关问题