Python中的字数分离

2024-10-05 21:56:27 发布

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

我必须在字符串中搜索以数字作为前缀或后缀的单词(例如,“abc21”或“943xyz”)。然后,我需要把数字和单词分开。你知道吗

例如, “abc12”必须转换为“abc12” 或者“12abc”必须转换为“12abc”

例如,如果数字在字母之间,那么“它应该在字母之间”。我们怎么能做到这一点?有比regex更简单的方法吗?你知道吗


Tags: 方法字符串字母数字单词后缀regexabc12
3条回答

像这样简单的东西。
我们只需要用这些(?<! [\da-z] ) .. (?! [\da-z] )
来保护边界 它有两个功能:
-它会阻止引擎在同类(数字或字母)之间进行匹配。
-确保没有书尾类型。你知道吗

方式1:

查找(?<![\da-z])(?:([a-z]+)(\d+)|(\d+)([a-z]+))(?![\da-z])
替换$1$3 $2$4

https://regex101.com/r/k4gNoE/1

 (?<! [\da-z] )
 (?:
      ( [a-z]+ )             # (1)
      ( \d+ )                # (2)
   |  
      ( \d+ )                # (3)
      ( [a-z]+ )             # (4)
 )
 (?! [\da-z] )

方式2:

查找(?<![\da-z])(?:([a-z]+(?=\d)|\d+(?=[a-z]))((?<=\d)[a-z]+|(?<=[a-z])\d+))(?![\da-z]) 替换$1 $2

https://regex101.com/r/LbWnkg/1

 (?<! [\da-z] )
 (?:
      (                        # (1 start)
           [a-z]+ 
           (?= \d )
        |  \d+ 
           (?= [a-z] )
      )                        # (1 end)
      (                        # (2 start)
           (?<= \d )
           [a-z]+ 
        |  (?<= [a-z] )
           \d+ 
      )                        # (2 end)
 )
 (?! [\da-z] )

可以使用^{}插入该空格:

re.sub(r'\b(?:(\D+)(\d+)|(\d+)(\D+))\b', r"\1\3 \2\4", word)

这与数字后跟非数字匹配,反之亦然。你知道吗

\b边界确保单词的整体匹配,这样我们就不会匹配单词中间的数字。你知道吗

替换模式\1\3 \2\4利用了不匹配的组被空字符串替换的事实。我们知道第1组和第2组或第3组和第4组将匹配,其他组将为空,因此\1\3 \2\4将始终生成有效的结果(不复制输入的任何部分)。你知道吗


示例:

>>> re.sub(r'\b(?:(\D+)(\d+)|(\d+)(\D+))\b', r"\1\3 \2\4", "abc12")
'abc 12'
>>> re.sub(r'\b(?:(\D+)(\d+)|(\d+)(\D+))\b', r"\1\3 \2\4", "12abc")
'12 abc'
>>> re.sub(r'\b(?:(\D+)(\d+)|(\d+)(\D+))\b', r"\1\3 \2\4", "a12bc")
'a12bc'

你可以试试这个:

def split_vals(s):
  return ' '.join(re.findall('^\d+|\d+$|^[a-zA-Z]\d+[a-zA-Z]+$|^[a-zA-Z]+$|[a-zA-Z]+', s))
s = ["abc21", "943xyz", '12abc', "a12bc"]
new_s = list(map(split_vals, s))

输出:

['abc 21', '943 xyz', '12 abc', 'a12bc']

相关问题 更多 >