首页 > 解决方案 > re.sub w/ 以不同数字结尾的子字符串

问题描述

有一堆我正在尝试清理的变量标签。

每个字符串都以问题编号开头,例如“Q1_1 - 你几岁?”

我想在问题开始之前删除所有内容。

输入:"Q1_1 - How old are you?"

输出:"How old are you?"

刚开始使用re.sub并了解如何在个案中使用它,但是对于 40 多个变量,我一次都不知所措,无法在网上找到任何有效的东西。

在网上找到了这段代码,它只是将字符从“_”替换为“-”:

re.sub('/.*- / ','',myvarlabel)

标签: pythonregex

解决方案


.*您的模式对可能导致广泛匹配的点使用了一个贪婪的量词。

如果每个字符串都以您的模式开头,您还可以使用锚^来断言字符串的开头。

对于您的示例字符串,您可以使用此模式获得更精确的匹配,然后替换为空字符串。

正则表达式演示| Python 演示

^Q\d+[a-zA-Z0-9]*_[a-zA-Z0-9]+ +- +

那将匹配

  • ^字符串的开始
  • Q\d+匹配 Q 后跟 1+ 个数字
  • [a-zA-Z0-9]*匹配字符类中列出的任何 0+ 次
  • _[a-zA-Z0-9]+匹配下划线,匹配字符类中列出的任何 1 次以上
  • +- +匹配 1+ 次空格,连字符,1+ 次空格

注意:您可以使用而不是空格,\s但请注意,这也将匹配换行符。

例如:

re.sub(r"^Q\d+[a-zA-Z0-9]*_[a-zA-Z0-9]+ +- +", "", "Q1_1 - How old are you?")

或者使用否定字符类来获得更广泛的匹配:

^Q\d+[^_]*_\S+ +- +

正则表达式演示


推荐阅读