You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:16:26