我是编程和阅读“使用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)
答案 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))
也许有帮助,当然可以进一步简化。