Python RE问题 - 正确的状态初始格式

时间:2011-03-15 15:22:56

标签: python

我有一个我需要编辑的字符串,它看起来与此类似:

string = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited"

如果您注意到状态初始“Mn”没有正确格式化。我正在尝试使用正则表达式来改变它:

re.sub("[A-Z][a-z],", "[A-Z][A-Z],", string)

然而,re.sub将第二部分视为文字,并将Mn改为[A-Z] [A-Z]。我将如何使用re.sub(或类似且简单的东西)在此字符串中正确地将Mn更改为MN?

提前谢谢!

4 个答案:

答案 0 :(得分:2)

您的re.sub可能会修改您不想修改的字符串部分。尝试明确处理列表中的正确元素:

input = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited"
elems = input.split(',')
elems[3] = elems[3].upper()
output = ','.join(elems)

返回

'Idaho Ave N,,Crystal,MN,55427-1463,US,,610839124763,Expedited'

答案 1 :(得分:0)

您可以将函数作为替换参数传递给re.sub,以从匹配对象生成替换字符串,例如:

import re

s = "Idaho Ave N,,Crystal,Mn,55427-1463,US,,610839124763,Expedited"

def upcase(match):
    return match.group().upper()

print re.sub("[A-Z][a-z],", upcase, s)

(这忽略了你是否真的用这种方法找到状态首字母的担忧。)

re.sub的相应文档为here

答案 2 :(得分:0)

sub(pattern, repl, string, count=0)
     

返回通过替换最左边获得的字符串   由字符串中的模式非重叠出现   替换代表repl可以是字符串也可以是可调用的;   如果处理了一个字符串,则反斜杠转义。如果是   一个可调用的,它传递了匹配对象,必须返回   要使用的替换字符串。

re.sub("[A-Z][a-z]", lambda m: m.group(0).upper(), myString)

我会避免调用你的变量string,因为那是一个类型名称。

答案 3 :(得分:-1)

您可以在正则表达式中的括号中创建一个组,然后通过其组号引用它:

re.sub("([A-Z][a-z]),", "\1,".upper(), string)