【问题标题】:Regular Expression for split multiple strings with different pattern用于拆分具有不同模式的多个字符串的正则表达式
【发布时间】:2022-01-17 11:59:40
【问题描述】:

我正在尝试使用正则表达式将字符串拆分为多个字符串。 我有如下字符串:

  • '1. 10.25% 2. 11% 3. 9.75% 4. 4.3%'

  • '1.promising.2.inappropriately3.essential.4.intense.'

  • '1.他没有参加 2. 英语课 3. 一个月以来 4.没有错误'

  • '1. X 获得 15 股2。 B获得25股3。 W 得到 54 股。4 股。马克获得了 2.5 股'

我期待这样的输出:

  • '1. X 获得 15 股''2. B得到25股','3。 W 得到 54. 股。', '4.马克获得了 2.5 股'

  • '1. 10.25%'

  • '2. 11%'

  • '3. 9.75%'

  • '4. 4.3%'

我想编写一个表达式来分割所有给定的场景。 我尝试编写以下表达式,但在某些情况下会失败

re.split(r'(?=[1-9]{1}\.[\s]?[a-zA-Z0-9\.\:\(\)\-\,\% ]+)', string)

【问题讨论】:

  • Regex 不能执行数学运算,所以使用 "sequential numbers" 的任务会更好地使用 python 来解决。
  • 请写出预期的输出
  • 在您将"W got 54. shares" 加入其中之前,问题不大。
  • 这是用正则表达式格式化的非常可怕的文本! 3. W got 54. shares.4. Mark got 2.5 shares????
  • @JvdV 是的,如果 dot 介于两者之间会给我带来问题。同样在某些情况下,我有带有浮点数的字符串。

标签: python regex


【解决方案1】:

我建议查找(?<!\d)NUM\. 中使用的每个后续数字(NUM 紧随其后的是 .,没有其他前面的数字)模式并仅在这些位置拆分:

import re

texts = ['1. 10.25% 2. 11% 3. 9.75% 4. 4.3%',
'1.promising.2.inappropriately3.essential.4.itense.',
'1. He has not been attending 2. English classes 3. since one month4. No error',
'1. X got 15 shares2. B got 25 shares3. W got 54. shares.4. Mark got 2.5 shares']

pattern = r'(?<!\d){}\.'
for text in texts:
    bps = []
    prev = 0
    for i in range(1,1000):
        rx = re.compile(pattern.format(i))
        m = rx.search(text, prev)
        if m:
            if prev != m.start():
                bps.append(text[prev:m.start()].strip())
            prev = m.start()
        else:
            break
    if prev < len(text) - 1:
        bps.append(text[prev:].strip())
    print(bps) 

请参阅Python demo

输出:

['1. 10.25%', '2. 11%', '3. 9.75%', '4. 4.3%']
['1.promising.', '2.inappropriately', '3.essential.', '4.itense.']
['1. He has not been attending', '2. English classes', '3. since one month', '4. No error']
['1. X got 15 shares', '2. B got 25 shares', '3. W got 54. shares.', '4. Mark got 2.5 shares']

注意rx = re.compile(pattern.format(i))m = rx.search(text, prev) 行:编译模式是因为Pattern.search 方法允许从指定位置进行搜索,即上一个匹配开始位置。

range(1,1000) 部分可以调整,1000 假设您在文本中有多达 999 个项目符号。

【讨论】:

  • 很难破解。想象一下如果 W. 只有 4 股会发生什么?
  • 我担心的是,如果输入如此混乱,这样的解决方案可能不起作用!...例如,如果是:1. W got 2. shares.2. X got 1 share.3.Y for 4.4. Z got 5.5.?在某些时候,您可能只需要接受数据太混乱了,然后在漏斗的早期进行更清晰的“拆分”!
  • @TomLord 在这种情况下,是precising the regex 的问题。
  • @JvdV 那么2. shares中的2.是一个有效的分割点。
  • @WiktorStribiżew 在我上面给出的示例中,拆分["1. W got", "2. shares.2. X got 1 share"]["1. W got 2. shares.", "2. X got 1 share"] 的“正确”答案是什么?这是模棱两可的。
猜你喜欢
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多