下面是一个练习- Regex ()的Regex版本 -
编写一个函数,该函数接受一个字符串,并执行与
strip()string方法相同的操作。如果没有传递除要剥离的字符串以外的其他参数,则将从字符串的开头和结尾移除空格字符。否则,函数的第二个参数中指定的字符将从字符串中删除。
我写了以下代码。有什么更好的方法来写吗?任何反馈都是非常感谢的。
import re
def regex_strip(s, chars = None):
if chars == None:
strip_left = re.compile(r'^\s*')
strip_right = re.compile(r'\s*下面是一个输出示例-s = '.* alphabetatheta *4453 +-'
print(regex_strip(s, '.+-*'))
>>> alphabetatheta *4453 )
s = re.sub(strip_left, "", s)
s = re.sub(strip_right, "", s)
else:
strip_left = re.compile(r'^[' + re.escape(chars) + r']*')
strip_right = re.compile(r'[' + re.escape(chars) + r']*下面是一个输出示例-A6)
s = re.sub(strip_left, "", s)
s = re.sub(strip_right, "", s)
return s下面是一个输出示例-
A6
发布于 2019-06-15 20:40:27
如果您调用regex_strip(s, ""),您将得到:
re.error:位置0处的未终止字符集
因为^[]和[]$都不是有效的正则表达式。您可以通过使用if not chars:而不是if chars == None:来避免这种情况。
没有必要对正则表达式进行re.compile();您不会将编译好的模式保存到任何地方以供重用。
您可以通过使用reg-ex来捕获字符串的中间、非剥离部分来简化您的逻辑,而不是为开始和结束修剪操作执行两个替换操作:
import re
def regex_strip(s, chars = None):
if chars:
trim = '[' + re.escape(chars) + ']*'
else:
trim = r'\s*'
return re.fullmatch(f"{trim}(.*?){trim}", s).group(1)我不确定要求您编写自己的strip()函数的目的是将任务委托给reg引擎。当问题是制造一个坚果饼干时,它看起来就像出去买一个大锤一样。
发布于 2019-06-15 20:43:06
干的。两个分支机构都做相同的re.subs。把它们拿出来:
if chars is None:
strip_left = re.compile(r'^\s*')
strip_right = re.compile(r'\s*我建议更进一步,统一strip_*的计算:if chars is None:
chars = string.whitespace
strip_left = re.compile(r'^[' + re.escape(chars) + r']*')
strip_right = re.compile(r'[' + re.escape(chars) + r']*将推荐与None作为chars is None进行比较,而不是使用==。)
else:
strip_left = re.compile(r'^[' + re.escape(chars) + r']*')
strip_right = re.compile(r'[' + re.escape(chars) + r']*我建议更进一步,统一D2的计算:A3将C4与D5作为D6进行比较,而不是使用D7。)
s = re.sub(strip_left, "", s)
s = re.sub(strip_right, "", s)
return s我建议更进一步,统一D2的计算:A3将C4与D5作为D6进行比较,而不是使用D7。)
s = re.sub(strip_left, "", s)
s = re.sub(strip_right, "", s)
return s将C4与D5作为D6进行比较,而不是使用D7。
) else: strip_left = re.compile(r'^[' + re.escape(chars) + r']*') strip_right = re.compile(r'[' + re.escape(chars) + r']*
我建议更进一步,统一D2的计算:
A3
将C4与D5作为D6进行比较,而不是使用D7。
) s = re.sub(strip_left, "", s) s = re.sub(strip_right, "", s) return s
我建议更进一步,统一D2的计算:
A3
将C4与D5作为D6进行比较,而不是使用D7。
https://codereview.stackexchange.com/questions/222372
复制相似问题