字符串 Formatting/Template/Regular 表达式

String Formatting/Template/Regular Expressions

我有一个字符串格式,假设 A = 字母数字和 N = 整数,所以模板是 "AAAAAA-NNNN" 现在用户有时会省略破折号,有时 "NNNN" 只有三位数字在这种情况下,我需要它来填充 0。"NNNN" 的第一个数字必须为 0,因此如果它是一个数字,则它是 "AAAAAA" 的最后一个数字,而不是 "AAAAAA" 的第一个数字"NNNN"。所以本质上,如果我有以下输入,我想要以下结果:

示例输入:

"SAMPLE0001"
"SAMPL1-0002"
"SAMPL3003"
"SAMPLE-004"

期望输出:

"SAMPLE-0001"
"SAMPL1-0002"
"SAMPL3-0003"
"SAMPLE-0004"

我知道如何使用正则表达式检查它,但实际上我想做相反的事情。我想知道除了对所有这些变化进行嵌套条件检查之外,是否有一种简单的方法可以做到这一点。我正在使用 python 和 pandas,但其中一个就足够了。

正则表达式模式为:

"[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-\d\d\d\d"

或缩写形式:

"[a-zA-Z0-9]{6}-[\d]{4}"

可以通过两个 re.sub 函数实现。

>>> import re
>>> s = '''SAMPLE0001
SAMPL1-0002
SAMPL3003
SAMPLE-004'''
>>> print(re.sub(r'(?m)(?<=-)(?=\d{3}$)', '0', re.sub(r'(?m)(?<=^[A-Z\d]{6})(?!-)', '-', s)))
SAMPLE-0001
SAMPL1-0002
SAMPL3-0003
SAMPLE-0004

解释:

  • re.sub(r'(?m)(?<=^[A-Z\d]{6})(?!-)', '-', s)会先处理。只有当后面的字符不是连字符时,它才会在从头开始的第 6 个字符后放置一个连字符。

  • re.sub(r'(?m)(?<=-)(?=\d{3}$)', '0', re.sub(r'(?m)(?<=^[A-Z\d]{6})(?!-)', '-', s)) 通过将上述命令的输出作为输入,这将在连字符后添加一个数字 0 并且后面的字符必须正好是 3.

另一种解决方案,它使用 str.join:

import re
inputs = ['SAMPLE0001', 'SAMPL1-0002', 'SAMPL3003','SAMPLE-004']
outputs = []
for input_ in inputs:
    m = re.match(r'(\w{6})-?\d?(\d{3})', input_)
    outputs.append('-0'.join(m.groups()))
print(outputs)
# ['SAMPLE-0001', 'SAMPL1-0002', 'SAMPL3-0003', 'SAMPLE-0004']

我们正在将正则表达式 (\w{6})-?\d?(\d{3}) 与输入字符串进行匹配,并将捕获的组与字符串 '-0' 连接起来。这个非常简单快速。

如果您需要对正则表达式本身进行更深入的解释,请告诉我。