【问题标题】:Python regular expression retrieving numbers between two different delimitersPython正则表达式检索两个不同分隔符之间的数字
【发布时间】:2018-02-21 05:16:50
【问题描述】:

我有以下字符串

"h=56,7,1,d=88,9,1,h=58,8,1,d=45,h=100,d=,"

我想使用正则表达式来提取组:

  • group1 56,7,1
  • group2 88,9,1
  • group3 58,8,1
  • group4 45
  • group5 100
  • group6 为空

我的最终目标是拥有 (group1, group2), (group3, group4), (group5, group6) 这样的元组。我不确定这一切是否可以通过正则表达式来完成。

我有以下正则表达式给我部分结果

(?<=h=|d=)(.*?)(?=h=|d=)

匹配项末尾有一个额外的逗号,例如 56,7,1,,我想删除它,而 d=, 没有返回空值。

【问题讨论】:

  • 你为什么坚持用正则表达式提取这些?如果您要在 = 上拆分,然后将其中每个的 RHS 拆分为逗号,该怎么办。遍历 enumerate() 以跳过第一个并使用每个 [:-1] 来丢弃(显然不需要的)“d”和“h”标签。
  • 我猜是因为他们有 11 个声誉,这表明他们对 python 不熟悉,他们只需要将它用于这个特定的任务。

标签: python regex


【解决方案1】:

您可能不需要使用正则表达式。 list comprehension.split() 可能会满足您的需求:

代码:

def split_it(a_string):
    if not a_string.endswith(','):
        a_string += ','
    return [x.split(',')[:-1] for x in a_string.split('=') if len(x)][1:]

测试代码:

tests = (
    "h=56,7,1,d=88,9,1,h=58,8,1,d=45,h=100,d=,",
    "h=56,7,1,d=88,9,1,d=,h=58,8,1,d=45,h=100",
)

for test in tests:
    print(split_it(test))

结果:

[['56', '7', '1'], ['88', '9', '1'], ['58', '8', '1'], ['45'], ['100'], ['']]
[['56', '7', '1'], ['88', '9', '1'], [''], ['58', '8', '1'], ['45'], ['100']]

【讨论】:

  • +1 表示不使用正则表达式,但可能没有数字的字母不是最后一个条目(即h=56,7,1,d=88,9,1,d=,h=58,8,1,d=45,h=100
  • 可能违反了基本结构,但确定为什么不呢?
【解决方案2】:

您可以使用表达式匹配而不是拆分

[dh]=([\d,]*),

并抓住第一组,见a demo on regex101.com


那是
[dh]=     # d or h, followed by =
([\d,]*)  # capture d and s 0+ times
,         # require a comma afterwards


Python:
import re

rx = re.compile(r'[dh]=([\d,]*),')

string = "h=56,7,1,d=88,9,1,h=58,8,1,d=45,h=100,d=,"

numbers = [m.group(1) for m in rx.finditer(string)]
print(numbers)

产量

['56,7,1', '88,9,1', '58,8,1', '45', '100', '']

【讨论】:

    【解决方案3】:

    你可以使用([a-z]=)([0-9,]+)(,)?

    Online demo

    只需要给组添加索引

    【讨论】:

      【解决方案4】:

      您可以在正向前瞻中使用$ 来匹配字符串的结尾:

      import re
      
      input_str = "h=56,7,1,d=88,9,1,h=58,8,1,d=45,h=100,d=,"
      groups = []
      for x in re.findall('(?<=h=|d=)(.*?)(?=d=|h=|$)', input_str):
          m = x.strip(',')
          if m:
              groups.append(m.split(','))
          else:
              groups.append(None)
      
      print(groups)
      

      输出:

      [['56', '7', '1'], ['88', '9', '1'], ['58', '8', '1'], ['45'], ['100'], None]
      

      【讨论】:

        【解决方案5】:

        在这里,我假设参数只有数值。如果是这样,那么你可以试试这个。 (?

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 1970-01-01
          • 2019-05-07
          • 1970-01-01
          • 1970-01-01
          • 2019-07-02
          • 2017-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多