Python:按数字、字母和 -_ 拆分字符串

Mai*_*iii 4 python regex string split

假设我有一个这样的字符串

string = 'rename_file_1122--23-_12'
Run Code Online (Sandbox Code Playgroud)

有没有办法像那样分割这个

parts = ['rename','_','file','_','1122','--','23','-_','12']
Run Code Online (Sandbox Code Playgroud)

我尝试使用正则表达式但它不起作用

import re

name_parts = re.findall('\d+|\D+|\w+|\W+', string)
Run Code Online (Sandbox Code Playgroud)

结果是:

['rename_file_', '1122', '--', '23', '-_', '12']
Run Code Online (Sandbox Code Playgroud)

########## 第二部分

如果我有这样的字符串:

string2 = 'Hello_-Marco5__-'
Run Code Online (Sandbox Code Playgroud)

我需要使用什么条件来获取 : ['Hello','_-','Marco','5','__-']. 我的目标是拆分字符串 y 组字母、数字和“-_”。

谢谢你的回答

Wik*_*żew 8

您可以使用

re.findall(r'[^\W_]+|[\W_]+', string)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

正则表达式详细信息

  • [^\W_]+- 除了非单词和_字符之外的一个或多个字符(因此,一个或多个字母或数字)
  • | - 或者
  • [\W_]+- 一个或多个非单词和/或_字符。

看一个Python 演示

import re
string = 'rename_file_1122--23-_12'
name_parts = re.findall(r'[^\W_]+|[\W_]+', string)
print(name_parts)
# => ['rename', '_', 'file', '_', '1122', '--', '23', '-_', '12']
Run Code Online (Sandbox Code Playgroud)

  • @PranavHosangadi 这是一种标记化技术,在一个模式中使用两个独立的相反替代方案。它们最终匹配所有文本,确实如此,只是将其分成两种类型的标记。根据代币类型,可能有更多替代方案。 (3认同)
  • 当我查看这个正则表达式时,我反复思考了几次,因为我想‘呃?匹配非“某物”还是匹配“某物”?那将匹配_一切_'。这正是它需要做的——找到“非某事”或“某事”,并继续匹配,直到找到相反的内容。好的! (2认同)