【问题标题】:I'm using re.split() and trying to join the elements but it doesn't work. Why is it?我正在使用 re.split() 并尝试加入元素,但它不起作用。为什么?
【发布时间】:2021-11-29 15:08:48
【问题描述】:

我有一个问题,我找不到原因。 我想把字符串分成3部分,条件是“整数+字母+*(可选)” 数字为一位时效果很好,但数字为两位时就不行了。

这是我的代码:

import re
dartResult = '10S*3T2D*'
dartresult = re.split('(\d)',dartResult)   
dartresult=[i for i in dartresult if i != ""]
score = []
for i in range(len(dartresult)):
    try:
        if int(dartresult[i]):
            score.append(["".join(dartresult[i:i+2])])
        elif int(dartresult[i]) and int(dartresult[i+1]):   #in case the number is two digits
            score.append(["".join(dartresult[i:i+3])])    
    except:
        pass
print(dartresult)
print(score)

这就是结果。

['1', '0', 'S*', '3', 'T', '2', 'D*']
[['10'], ['3T'], ['2D*']]

如果您告诉我是否有更好的方法根据上述条件划分字符串,那就太好了。

【问题讨论】:

  • \d 仅指单个字符,这就是为什么它只捕获一个数字。你的意思是\d+,它会占用尽可能多的连续数字?
  • 为什么S*会消失?

标签: python split python-re


【解决方案1】:

为什么不简单地定义正则表达式中的所有元素?

import re
dartResult = '10S*3T2D*'
out = re.findall(r'\d+\w\*?', dartResult)

输出:

>>> out
['10S*', '3T', '2D*']

正则表达式:

\d+     # one or more digits
\w      # one character (letters/digit/underscore), to restrict to letters use [a-zA-Z]
\*?     # optionally, one "*" character

【讨论】:

  • 感谢您的具体说明!我要改代码
【解决方案2】:

在您的 \d 之后立即放置一个 + 以捕获任何连续的数字字符。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多