如何在Python中使用正则表达式按位置过滤非数字单词
Python正则提取首个连续非数字序列与末尾非数字单词
需求
我是Python 3.8版本的新手,需要用正则表达式从任意格式的字符串中,提取出第一个连续非数字单词序列和最后一个非数字单词,完全排除数字内容。
测试代码、当前输出及期望输出
测试代码
import re s = 'abcd xyz efgh 1691 2191.7 1296 15.4 efgh eghj' print(re.search(r'[A-Za-z]+', s)) s1 = 'abcd xyz:efgh 1691 2191.7 1296 15.4 efgh' print(re.search(r'(\w+)', s))
当前输出
<re.Match object; span=(0, 4), match='abcd'> <re.Match object; span=(0, 4), match='abcd'>
期望输出
首个连续非数字序列
<re.Match object; span=(0, 12), match='abcd xyz efgh'> <re.Match object; span=(0, 13), match='abcd xyz:efgh'>
解决方案
提取首个连续非数字序列
原正则仅匹配单个字母片段,要捕获第一个数字出现前的所有非数字内容,可使用正则 r'^[\D]+',再通过strip()去除首尾多余空白,就能得到目标序列:
import re s = 'abcd xyz efgh 1691 2191.7 1296 15.4 efgh eghj' match_first = re.search(r'^[\D]+', s) if match_first: first_seq = match_first.group().strip() print(f"首个序列: '{first_seq}'") # 输出: 'abcd xyz efgh' s1 = 'abcd xyz:efgh 1691 2191.7 1296 15.4 efgh' match_first_s1 = re.search(r'^[\D]+', s1) if match_first_s1: first_seq_s1 = match_first_s1.group().strip() print(f"首个序列: '{first_seq_s1}'") # 输出: 'abcd xyz:efgh'
正则说明:
^:匹配字符串起始位置[\D]+:匹配一个或多个非数字字符(包含空格、符号等)
提取最后一个非数字单词
要定位字符串末尾的非数字单词,使用正则 r'[^\d\s]+(?=\s*$)',它能精准匹配结尾的非数字、非空白字符序列:
match_last = re.search(r'[^\d\s]+(?=\s*$)', s) if match_last: print(f"最后一个单词: '{match_last.group()}'") # 输出: 'eghj' match_last_s1 = re.search(r'[^\d\s]+(?=\s*$)', s1) if match_last_s1: print(f"最后一个单词: '{match_last_s1.group()}'") # 输出: 'efgh'
正则说明:
[^\d\s]+:匹配一个或多个既不是数字也不是空白的字符(?=\s*$):正向预查,确保匹配内容后是零个或多个空白字符,直到字符串结尾
内容的提问来源于stack exchange,提问作者Kishan
相关产品推荐
相关产品推荐

