我有一个字符串格式让我们说A =字母数字和N =整数,所以模板是“AAAAAA-NNNN”现在用户有时会省略破折号,有时“NNNN”只有三位数,在这种情况下我需要它填充0.“NNNN”的第一个数字必须为0,因此如果是数字,则是“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}"
答案 0 :(得分:2)
可以通过两个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.
答案 1 :(得分:1)
另一种解决方案是使用str.join:
./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()
我们将正则表达式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})
加入捕获的组。这非常简单快捷。
如果您需要对正则表达式本身进行更深入的解释,请告诉我。