字符串 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'
连接起来。这个非常简单快速。
如果您需要对正则表达式本身进行更深入的解释,请告诉我。
我有一个字符串格式,假设 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'
连接起来。这个非常简单快速。
如果您需要对正则表达式本身进行更深入的解释,请告诉我。