Regex 仅提取带感叹号的alphanum和连字符问题

Regex 仅提取带感叹号的alphanum和连字符问题,regex,Regex,如果除了a-zA-Z0-9-以外的任何东西出现,我正在尝试拆分字符串。但是没有分裂 li=re.split('([^a-zA-Z0-9-])+',st) st="We are at Ignite Solutions! Their email-id is careers@ignitesol.com" #Output : ['We', ' ', 'are', ' ', 'at', ' ', 'Ignite', ' ', 'Solutions', ' ', 'Their', ' ', 'email-i

如果除了a-zA-Z0-9-以外的任何东西出现,我正在尝试拆分字符串。但是没有分裂

li=re.split('([^a-zA-Z0-9-])+',st)
st="We are at Ignite Solutions! Their email-id is careers@ignitesol.com"
#Output : ['We', ' ', 'are', ' ', 'at', ' ', 'Ignite', ' ', 'Solutions', ' ', 'Their', ' ', 'email-id', ' ', 'is', ' ', 'careers', '@', 'ignitesol', '.', 'com']
为什么答案后面没有感叹号

预期产出: #输出:['We'、''are'、''at'、''Ignite'、''Solutions'、'!'、'、'Thers'、''email id'、''is'、''careers'、'@'、'ignitesol'、'com']

如果你量化
([^a-zA-Z0-9-])+([^a-zA-Z0-9-]+)
中以捕获完整序列,或者通过删除它来获取每个匹配项
([^a-zA-Z0-9-])
。但有趣的是,
split
会导致额外的空匹配

或者使用
re.findall
获得所需的输出

  • [\w-]+
    匹配字符,这些字符可以是连字符或连字符
  • |[^\w-]
    或其


如果确实需要使用
re.split
,请尝试不捕获

res = re.split(r'\b(?!-|^|$)(?<!-)|\B(?!\w)', str)

res=re.split(r'\b(?)-| ^ |$)(?尝试删除捕获组
[^a-zA-Z0-9-]+
仍然不变,现在从列表中删除了空格您需要将
+
量词放入组中:
([^a-zA-Z0-9-]+)
@BobbleBobble这起作用了,但你能解释一下是怎么起作用的吗?findall很好,我还是不确定split为什么会在这起作用way@EXODIA我也是,你可以开始一个新问题吗?我的解释如下。我用PHP尝试了这个方法:这也会导致额外的匹配。只要两个拆分序列在e旁边,就会发生这种情况其他。也可以尝试使用
[a-zA-Z0-9-]
。每个字母后面都会有一个空str。我认为原因是,通过使用括号,您可以选择输出分割序列。但是因为您使用的是
split
函数,所以始终会有一个分割。只要您得到两个彼此相隔的分割序列,它们之间就会有一个额外的分割,因为使用
split
功能的安全性。