【问题标题】:split string on numeric/non-numeric boundary [duplicate]在数字/非数字边界上拆分字符串[重复]
【发布时间】:2020-05-17 06:51:13
【问题描述】:

我想将一个字符串拆分为一个列表 (Python),其中每个段要么是完全数字的,要么完全是非数字的

例子;

  • '100.200.300'['100', '.', '200', '.', '300']
  • 'abc0foo!bar'['abc', '0', 'foo!bar']
  • '123'['123']
  • 'foo'['foo']

输入可能以数字部分或非数字部分开始或结束。结果,当加入 "" 时,必须完整复制原始输入。

如果我分开,例如\d+ 然后我将保留非数字部分并丢失数字部分。我可以在 ^(\d+|\D+)(.*)$ 上循环播放,但这很烦人。

我可以(在单个表达式中)在边界上拆分并将所有字符串部分和非字符串部分保留在结果列表中吗?

【问题讨论】:

  • re.findall(r'\d+|\D+') 适用于您发布的每个示例。

标签: python regex


【解决方案1】:

您可以在正则表达式中使用正向前瞻和后向的组合来确定可以拆分给定字符串的边界(分隔符)。使用:

import re

matches = re.split(r'(?<=\D)(?=\d)|(?<=\d)(?=\D)', string)

给定字符串的结果 matches 将是,

['abc', '0', 'foo!bar'] # 'abc0foo!bar'
['100', '.', '200', '.', '300'] # '100.200.300'
['123'] # '123'
['foo'] # 'foo'

解释:

  1. 正面观察(?&lt;=\D)

    • \D 匹配任何不是数字的字符。
  2. 正向预测(?=\d)

    • \d 匹配一个数字(等于 [0-9])
  3. 正面观察(?&lt;=\d)

    • \d 匹配一个数字(等于 [0-9])
  4. 正向预测(?=\D)

    • \D 匹配任何不是数字的字符。

您可以测试正则表达式here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2019-05-18
    • 2014-12-22
    • 2021-11-24
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多