【问题标题】:Regex: Exclude alphabets and extract numbers alone正则表达式:排除字母并单独提取数字
【发布时间】:2021-04-15 20:05:58
【问题描述】:
我有一个数据框列,其中包含与此类似的数据,
1015 - 1540
56.56 - 156
34.46Sq. Meter
36Sq. Meter
1000Sq. Meter
我需要删除字母并使列中的数据如下所示。
1015 - 1540
56.56 - 156
34.46
36
1000
我尝试了下面的正则表达式模式,但是,它似乎无法正常工作。提前感谢您的帮助。
(\d*\s\-\s\d*)|(\d*[\.]?\d*)(?=\w)
【问题讨论】:
标签:
python-3.x
regex
pandas
regex-lookarounds
【解决方案1】:
你可以使用
df['result'] = df['col'].str.extract(r'(\d+(?:\.\d+)?(?:\s*-\s*\d+(?:\.\d+)?)?)', expand=False)
请参阅regex demo。正则表达式包含一个匹配的捕获组(Series.str.extract 需要至少一个捕获组才能返回值)
-
\d+(?:\.\d+)? - 一个或多个数字,然后是一个点和一个或多个数字的可选序列
-
(?: - 非捕获组的开始:
-
\s*-\s* - 用零个或多个空格括起来的连字符
-
\d+(?:\.\d+)? - 一个或多个数字,然后是一个点和一个或多个数字的可选序列
-
)? - 组结束,匹配 1 次或 0 次(即可选)。
【解决方案2】:
删除(通过替换为空白)与此正则表达式匹配的所有不需要的字符:
[^\d .-]|(?<! )-(?! )|(?<=\D)[.]|(?<!-) (?!-)
见live demo。
使用re.sub(thisRegex, '', yourStr),即:
cleaned = re.sub('[^\d .-]|(?<! )-(?! )|(?<=\D)[.]|(?<!-) (?!-)', '', str)
正则表达式是 OR 或这些:
-
[^\d .-] 任何不是数字、空格、点或破折号的字符
-
(?<! )-(?! ) 破折号不在空格旁边
-
(?<=\D)[.] 点前面有一个非数字
-
(?<!-) (?!-) 不在破折号旁边的空格
如果它被大量使用,请考虑编译一次正则表达式并重用它。