Pythonic方式重写以下C ++字符串处理代码

时间:2010-11-11 02:01:53

标签: c++ python

上一篇,我有一个能够做到这一点的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方法是什么?正则表达能够实现吗?

感谢。

5 个答案:

答案 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+匹配一个或多个数字。
  • 括号用于捕获空格。
  • replacement参数通常是一个字符串,但它也可以是一个动态构造替换的函数。
  • 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)))