上一篇,我有一个能够做到这一点的C ++字符串处理代码。
input -> Hello 12
output-> Hello
input -> Hello 12 World
output-> Hello World
input -> Hello12 World
output-> Hello World
input -> Hello12World
output-> HelloWorld
以下是C ++代码。
std::string Utils::toStringWithoutNumerical(const std::string& str) {
std::string result;
bool alreadyAppendSpace = false;
for (int i = 0, length = str.length(); i < length; i++) {
const char c = str.at(i);
if (isdigit(c)) {
continue;
}
if (isspace(c)) {
if (false == alreadyAppendSpace) {
result.append(1, c);
alreadyAppendSpace = true;
}
continue;
}
result.append(1, c);
alreadyAppendSpace = false;
}
return trim(result);
}
我是否可以在Python中了解实现此类功能的Pythonic方法是什么?正则表达能够实现吗?
感谢。
答案 0 :(得分:7)
编辑:这比以前的版本更准确地再现了C ++代码。
s = re.sub(r"\d+", "", s)
s = re.sub(r"(\s)\s*", "\1", s)
特别是,如果几个空格中的第一个空格是一个选项卡,它将保留选项卡。
进一步编辑:无论如何要用空格替换,这都有效:
s = re.sub(r"\d+", "", s)
s = re.sub(r"\s+", " ", s)
答案 1 :(得分:5)
Python有许多内置函数,当它们一起使用时可以非常强大。
def RemoveNumeric(str):
return ' '.join(str.translate(None, '0123456789').split())
>>> RemoveNumeric('Hello 12')
'Hello'
>>> RemoveNumeric('Hello 12 World')
'Hello World'
>>> RemoveNumeric('Hello12 World')
'Hello World'
>>> RemoveNumeric('Hello12World')
'HelloWorld'
答案 2 :(得分:1)
import re
re.sub(r'[0-9]+', "", string)
答案 3 :(得分:0)
import re
re.sub(r"(\s*)\d+(\s*)", lambda m: m.group(1) or m.group(2), string)
故障:
\s*
匹配零个或多个空格。\d+
匹配一个或多个数字。lambda
用于创建内联函数,该函数返回两个捕获组中的任何一个非空。如果有空格,则保留空格,如果没有,则返回空字符串。答案 4 :(得分:0)
正则表达式答案显然是正确的方法。但如果您对没有正则表达式引擎的方法感兴趣,请按以下步骤操作:
class filterstate(object):
def __init__(self):
self.seenspace = False
def include(self, c):
isspace = c.isspace()
if (not c.isdigit()) and (not (self.seenspace and isspace)):
self.seenspace = isspace
return True
else:
return False
def toStringWithoutNumerical(s):
fs = filterstate()
return ''.join((c for c in s if fs.include(c)))