Python正则表达式拆分字母数字字符串为两列问题求助
问题原因分析及修正方案
原正则失效的核心原因
你用的正则(?P\D*)(?P\d+)有两个关键问题:
- 捕获组命名语法错误:正则的命名捕获组格式应该是
(?P<组名>匹配规则),你写的(?P\D*)缺少了组名的尖括号(比如应该写成(?P<Letters>\D*)),这会导致正则引擎无法正确识别命名组,甚至可能引发语法错误。 - 匹配顺序完全反了:你的数据都是「数字在前,非数字在后」,但原正则先尝试匹配
\D*(任意数量的非数字字符)——而数字开头的字符串里,开头没有非数字,所以\D*只能匹配到空字符串;接着\d+匹配后面的数字,自然就捕获不到末尾的字母部分了。
符合需求的修正方案
结合你要求的「数字最长4位,非数字最长2位」,正确的正则应该先匹配1-4位数字,再匹配1-2位非数字,同时用命名组区分:
import pandas as pd Amount = pd.DataFrame({'Size':['200g', '20L', '2L', '1000L','3kg']}) result = Amount['Size'].str.extract(r'(?P<Numbers>\d{1,4})(?P<Letters>\D{1,2})') print(result)
执行后会得到:
Numbers Letters 0 200 g 1 20 L 2 2 L 3 1000 L 4 3 kg
补充说明
\d{1,4}:严格匹配1到4位数字,符合你「数字最长4位」的要求\D{1,2}:严格匹配1到2位非数字字符,符合你「非数字部分最长2位」的要求- 因为你的数据都是数字在前,所以正则顺序必须是数字组在前,非数字组在后,才能正确捕获两部分内容
内容的提问来源于stack exchange,提问作者FarmerScott
相关产品推荐
相关产品推荐

