Python 正则表达式删除";及;一串

Python 正则表达式删除";及;一串,python,regex,string,remove,Python,Regex,String,Remove,我正在尝试清理(稍后比较)艺术家名称,并希望删除: 非字母字符,或 空白,或 “和”这个词 所需输出:“bootsycollinsterubberband s = 'Bootsy Collins and The Rubber Band' res1 = re.sub(r'[^\w]|\s|\s+(and)\s', "",s) res2 = re.sub(r'[^\w]|\s|\sand\s', "",s) res3 = re.sub(r'[^\w]|

我正在尝试清理(稍后比较)艺术家名称,并希望删除:

  • 非字母字符,或
  • 空白,或
  • “和”这个词
  • 所需输出:“bootsycollinsterubberband

        s = 'Bootsy Collins and The Rubber Band'
    res1 = re.sub(r'[^\w]|\s|\s+(and)\s', "",s)
    res2 = re.sub(r'[^\w]|\s|\sand\s', "",s)
    res3 = re.sub(r'[^\w]|\s|(and)', "",s)
    
    print("\b",s,"\n"
          ,"1st: ",res1,"\n"
          ,"2nd: ",res2,"\n"
          ,"3rd: ",res3)
    
    
    
    Output:
    Bootsy Collins and The Rubber Band 
     1st:  BootsyCollinsandTheRubberBand 
     2nd:  BootsyCollinsandTheRubberBand 
     3rd:  BootsyCollinsTheRubberB
    

    前两个正则表达式与“and”不匹配,因为当到达字符串中的该位置时,正则表达式的
    \s
    部分将匹配“and”之前的空格,而不是正则表达式的
    \s+(and)\s
    部分

    您只需更改顺序,以便首先尝试后一种方法。而且,
    \s
    [^\w]
    的一部分,因此不需要单独匹配
    \s
    。最后,
    \w
    [^\w]
    的缩写形式。因此,请使用:

    \s+(和)\s\W
    
    前两个正则表达式与“and”不匹配,因为当到达字符串中的该位置时,正则表达式的
    \s
    部分将匹配“and”之前的空格,而不是正则表达式的
    \s+(and)\s
    部分

    您只需更改顺序,以便首先尝试后一种方法。而且,
    \s
    [^\w]
    的一部分,因此不需要单独匹配
    \s
    。最后,
    \w
    [^\w]
    的缩写形式。因此,请使用:

    \s+(和)\s\W
    
    为了支持您制定的规则,而不仅仅是在引用的示例文本上,您需要一个更通用的正则表达式,它为
    re.sub
    调用设置了正确的标志:

    re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
    
    解释
    • 设置标志
      re.IGNORECASE
      ,以便您也可以删除句子中的“And”(以及其他大小写组合变体)。如果您只想删除“And”,而不想删除其任何变体,则可以删除此标志设置
    • \band\b
      两侧带有单词边界标记的单词“和”。这与3个字符的顺序“和”匹配作为一个独立的词,而不是另一个词的子串。使用
      \b
      来隔离单词,而不是像
      \s+和\s
      那样将单词括在空格中,这样做的优点是
      \b
      选项还可以检测字符串中的单词边界,如
      和,
      ,而
      \s+和\s
      不能检测。这是因为逗号不是空白
    • 由于空格
      \s
      也是一种非单词
      \W
      (因为单词
      \W
      相当于
      [a-zA-Z0-9\]
      ),所以这两种代码不需要单独的regex标记<代码>\W已包括
      \s
      。因此,您可以简化正则表达式,而无需单独使用
      \s
    演示 测试用例#1:

    测试用例#2(“And”被删除):

    测试用例#3('and',[在'and'之后加逗号]被删除)

    计数器测试用例:(regex使用空格
    \s+
    \s
    代替
    \b
    作为单词边界)


    为了支持您设置的规则,而不仅仅是在引用的示例文本上,您需要一个更通用的正则表达式,带有
    re.sub
    调用的正确标志设置:

    re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
    
    解释
    • 设置标志
      re.IGNORECASE
      ,以便您也可以删除句子中的“And”(以及其他大小写组合变体)。如果只想删除“and”,而不想删除其任何变体,则可以删除此标志设置
    • \band\b
      两侧带有单词边界标记的单词“和”。这是为了将3个字符序列“and”作为一个独立的单词匹配,而不是作为另一个单词的子字符串。使用
      \b
      来隔离单词,而不是像
      \s+和\s
      那样将单词括在空格中,这样做的优点是
      \b
      选项还可以检测字符串中的单词边界,如
      和,
      ,而
      \s+和\s
      不能检测。这是因为逗号不是空白
    • 由于空格
      \s
      也是一种非单词
      \W
      (因为单词
      \W
      相当于
      [a-zA-Z0-9\]
      ),所以这两种代码不需要单独的regex标记<代码>\W已包括
      \s
      。因此,您可以简化正则表达式,而无需单独使用
      \s
    演示 测试用例#1:

    测试用例#2(“And”被删除):

    测试用例#3('and',[在'and'之后加逗号]被删除)

    计数器测试用例:(regex使用空格
    \s+
    \s
    代替
    \b
    作为单词边界)


    你能对这个答案给出一些反馈吗?你能对这个答案给出一些反馈吗?让我们知道这些答案是否对你有用。如果您需要更多信息,请同时告诉我们。让我们知道任何答案是否对您有用。如果您需要更多信息,也请告知我们。
    s = 'Bootsy Collins And The Rubber Band'
    res = re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
    print(res)
    
    Output:
    'BootsyCollinsTheRubberBand'
    
    s = 'Bootsy Collins and, The Rubber Band'
    res = re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
    print(res)
    
    Output:
    'BootsyCollinsTheRubberBand'
    
    s = 'Bootsy Collins and, The Rubber Band'
    res = re.sub(r'\s+(and)\s|\W', '',s)
    print(res)
    
    Output:   'and' is NOT removed
    'BootsyCollinsandTheRubberBand'