在Python中,正则表达式从字符串中删除“and”

2024-06-13 08:09:42 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我试图清除(稍后比较)艺术家名称,并希望删除:

  1. 非字母字符,或
  2. 空白,或
  3. “和”这个词

输入字符串:Bootsy Collins and The Rubber Band

所需输出:BootsyCollinsTheRubberBand

    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

Tags: andthere名称band字母字符艺术家
2条回答

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

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

\s+(and)\s|\W 

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

re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)

解释

  • 设置标志re.IGNORECASE,以便您也可以删除句子中的“And”(以及其他大小写组合变体)。如果只想删除“and”,而不想删除其任何变体,则可以删除此标志设置
  • \band\b两侧用单词边界标记\b括起来的单词“和”。这是为了将3个字符序列“and”作为一个独立的单词匹配,而不是作为另一个单词的子字符串。使用\b来隔离单词,而不是将单词封闭在像\s+and\s这样的空格中,这样做的好处是\b选项还可以检测字符串中的单词边界,比如and,,而\s+and\s则不能。这是因为逗号不是空白
  • 由于空格\s也是一种非单词\W(因为单词\w相当于[a-zA-Z0-9_]),所以这两个单词不需要单独的正则表达式标记\W已包括\s。因此,您可以简化正则表达式,而无需单独使用\s

演示

测试用例#1:

s = 'Bootsy Collins and The Rubber Band'
res = re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
print(res)

Output:
'BootsyCollinsTheRubberBand'

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

s = 'Bootsy Collins And The Rubber Band'
res = re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
print(res)

Output:
'BootsyCollinsTheRubberBand'

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

s = 'Bootsy Collins and, The Rubber Band'
res = re.sub(r'\band\b|\W', '', s, flags=re.IGNORECASE)
print(res)

Output:
'BootsyCollinsTheRubberBand'

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

s = 'Bootsy Collins and, The Rubber Band'
res = re.sub(r'\s+(and)\s|\W', '',s)
print(res)

Output:   'and' is NOT removed
'BootsyCollinsandTheRubberBand'            

相关问题 更多 >