字符串格式/模板/正则表达式

时间:2015-04-25 01:59:27

标签: python regex string pandas formatting

我有一个字符串格式让我们说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}"

2 个答案:

答案 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})加入捕获的组。这非常简单快捷。

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