【问题标题】:Regex to get non-alphanumeric strings between alphanumeric strings正则表达式获取字母数字字符串之间的非字母数字字符串
【发布时间】:2019-05-16 16:29:00
【问题描述】:

假设我有这个字符串:

Alpha+*&Numeric%$^String%%$

我想获取字母数字字符之间的非字母数字字符:

+*& %$^

我有这个正则表达式:[^0-9a-zA-Z]+ 但它给了我

+* %$^ %%$

其中包括我不想要的尾随非字母数字字符。我也试过[0-9a-zA-Z]([^0-9a-zA-Z])+[0-9a-zA-Z] 但它给了我

a+*&N c%$^S

其中包括字符aNcS

【问题讨论】:

  • @ggorlen 是的。已编辑
  • 空间从何而来?

标签: python regex


【解决方案1】:

如果您不介意将 _ 字符包含为字母数字数据,您可以使用以下方法提取所有非字母数字数据:

some_string = "A+*&N%$^S%%$"

import re
result = re.findall(r'\b\W+\b', some_string)  # sets result to:  ['+*&', '%$^']

注意我使用\b 而不是\w[^\W]

\w[^\W] 各匹配一个字符,因此如果您的字母数字字符串(在您想要的文本之间)恰好是一个字符,那么您认为应该是下一个匹配项的内容将不匹配。

但由于\b 是一个零宽度的“单词边界”,它并不关心有多少个字母数字字符,只要至少有一个即可。

【讨论】:

    【解决方案2】:

    第二次尝试的唯一问题是+ 限定符的位置——它应该在括号内。您还可以使用单词字符类 \w 及其逆词 \W 来提取这些项目,这与您的第二个正则表达式相同,但包含下划线 _ 作为单词的一部分:

    import re
    
    s = "Alpha+*&Numeric%$^String%%$"
    
    print(re.findall(r"\w(\W+)\w", s))                             # adds _ character
    print(re.findall(r"[0-9a-zA-Z]([^0-9a-zA-Z]+)[0-9a-zA-Z]", s)) # your version fixed
    print(re.findall(r"(?i)[0-9A-Z]([^0-9A-Z]+)[0-9A-Z]", s))      # same as above
    

    输出:

    ['+*&', '%$^']
    ['+*&', '%$^']
    ['+*&', '%$^']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2023-03-22
      • 2013-01-06
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多