Python:使用正则表达式的条带函数定义

时间:2017-09-21 13:00:25

标签: python regex

我是编程和阅读“使用Python自动化无聊的东西”这本书的初学者。在第7章中,有一个项目实践:strip()的正则表达式版本。我的代码不起作用(我使用Python 3.6.1)。有人可以帮忙吗?

import re

string = input("Enter a string to strip: ")
strip_chars = input("Enter the characters you want to be stripped: ")

def strip_fn(string, strip_chars):
    if strip_chars == '':
        blank_start_end_regex = re.compile(r'^(\s)+|(\s)+$')
        stripped_string = blank_start_end_regex.sub('', string)
        print(stripped_string)
    else:
        strip_chars_start_end_regex = re.compile(r'^(strip_chars)*|(strip_chars)*$')
        stripped_string = strip_chars_start_end_regex.sub('', string)
        print(stripped_string)

3 个答案:

答案 0 :(得分:0)

使用r'^(strip_chars)*|(strip_chars)*$'字符串文字时,strip_chars不会被插值,即它被视为字符串的一部分。您需要将它作为变量传递给正则表达式。但是,只是以当前形式传递它会导致“#34;腐败"正则表达式,因为正则表达式中的(...)分组结构,而您希望匹配strip_chars变量中存储的定义字符集中的单个字符。

你可以用一对[]包装字符串来创建一个字符类,但是如果变量包含,比如说z-a,它会使结果模式无效。您还需要转义每个字符以安全地播放它。

替换

r'^(strip_chars)*|(strip_chars)*$'

r'^[{0}]+|[{0}]+$'.format("".join([re.escape(x) for x in strip_chars]))

我建议将*零次或多次出现)替换为+一次或多次出现)量词,因为在大多数情况下,当我们想删除某些内容时,我们需要至少匹配一次不必要的字符串。

此外,您可以将r'^(\s)+|(\s)+$'替换为r'^\s+|\s+$',因为重复捕获组将在每次迭代时继续重写组值,从而略微妨碍正则表达式的执行。

答案 1 :(得分:0)

您还可以使用re.sub替换开头或结尾的字符。 让我们说一下char是'x'

re.sub(r'^x+', "", string)
re.sub(r'x+$', "", string)

第一行为lstrip,第二行为rstrip 这看起来更简单。

答案 2 :(得分:0)

#! python
# Regex Version of Strip()
import re
def RegexStrip(mainString,charsToBeRemoved=None):
    if(charsToBeRemoved!=None):
        regex=re.compile(r'[%s]'%charsToBeRemoved)#Interesting TO NOTE
        return regex.sub('',mainString)
    else:
        regex=re.compile(r'^\s+')
        regex1=re.compile(r'$\s+')
        newString=regex1.sub('',mainString)
        newString=regex.sub('',newString)
        return newString

Str='   hello3123my43name is antony    '
print(RegexStrip(Str))

也许有帮助,当然可以进一步简化。