re.sub w /子字符串以不同的数字结尾

时间:2019-03-26 16:18:58

标签: python regex

有一堆我要清除的变量标签。

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

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

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

输出:"How old are you?"

刚开始使用re.sub并了解如何根据具体情况使用它,但是一次遇到40多个变量,我一头雾水,找不到任何有效的在线方法。

在线找到此代码,它只是将字符从“ _”替换为“-”:

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

3 个答案:

答案 0 :(得分:1)

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

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

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

Regex demo | Python demo

^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+ +- +

Regex demo

答案 1 :(得分:0)

import os

s = 'Q1_1 - How old are you?'
print(re.sub(r'^.*Q\d+_\d+\s-\s','',s))

为这些工作:

IN: Q21_2 - How old are you?
OUT: How old are you?

IN: 123 - Q21_2 - Q21_2 - How old are you?
OUT: How old are you?

将与此不匹配:

IN: Q21_2 : How ol - d are you?

答案 2 :(得分:0)

要删除问题编号和[space]-[space],您的模式应为:

s = "Q1_1 - How old are you?"

re.sub(r"^Q\d+(_\d+)? +- +", "", s)

这将匹配

  • Q
  • 一个或多个digits 0-9
  • 可选的一个或多个_digit
  • 空格后接-

这使您可以匹配并删除以下任意项:

  • 第一季度-
  • Q1_1-
  • 第12季度-
  • Q12_12-