正则表达式使用Python的Re

时间:2011-04-15 22:03:08

标签: python regex

我有以下类似的文件:

line ='Weclome - MIsiti International,0,0,-9,0,'

我想将'Weclome - MIsiti International'替换为字符串'1'

这是我的代码:

exp=re.compile(r"([\./A-Za-z\s\-]+)")
print exp.sub("1",line)

不幸的是我得到以下输出:

1,0,0,19,0,

哪个不对。我认为这会奏效:

exp=re.compile(r"([\./A-Za-z\s\-[^0-9]]+)")
print exp.sub("1",line)

但事实并非如此:

[]

有人可以告诉我这里做错了吗?

5 个答案:

答案 0 :(得分:3)

为什么需要正则表达式?

>>> line = 'Weclome - MIsiti International,0,0,-9,0,'
>>> s=line.split(",")
>>> s[0]="1"
>>> ','.join(s)
'1,0,0,-9,0,'

答案 1 :(得分:2)

exp=re.compile(r"([\./A-Za-z\s\-]+)"

无需在括号之间的' - 之前加上'\ n'。将' - 放在括号之间的某个位置,它不能有其特殊含义。

此外,无需在括号之间的'。之前放置'\ n',因为括号之间的点会失去其特殊含义。

因此,请写exp=re.compile(r"([\./A-Za-z\s\-]+)")

而不是exp=re.compile(r"([./A-Za-z\s-]+)")

关于exp=re.compile(r"([\./A-Za-z\s\-[^0-9]]+)"),它完全不匹配,因为'['' - '相同:如果放在在它没有意义的位置,它失去了它的特殊含义,被简单地视为角色。

所以'^0-9]'之前的'['是括号,而不是类的开头。因此,'^0-9]'末尾的']''[\./A-Z...'中第一个左括号的结束括号,最后一个右括号后跟'+'表示“角色”至少一次,可能更多“

import re

line = 'Weclome - MIsiti International,0,0,-9,0,'

exp=re.compile(r"(^[./A-Za-z\s-]+)")
print exp.sub("1",line)

# or

exp=re.compile(r"([./A-Za-z\s-]+(?=,))")
print exp.sub("1",line) 

结果

1,0,0,-9,0,
1,0,0,-9,0,

答案 2 :(得分:1)

无法嵌套字符类。后面的例子会吃'[','^'等等。如果你只是做了r“(^ [^,0-9] +)”,即开头的任何东西都不是commaor 0-9,它会不会起作用吗?

答案 3 :(得分:0)

你是第一个正则表达式是好的,但你需要将它锚定到行的开头并添加'm'多行修饰符,如下所示:

import re
line = 'Weclome - MIsiti International,0,0,-9,0,'
exp = re.compile(r"^([./A-Za-z\s\-]+)", re.M)
print (exp.sub("1",line))

请注意,此解决方案可在一次操作中修复整个文件。

答案 4 :(得分:0)

大多数人都会给你答案<snark>通常符合“不要使用正则表达式!正则表达式是邪恶的,来自Perl!我们的Python用户只是文本处理!</snark>但是没有人正在解释你遇到这个问题的原因。

你的正则表达式正在运行。它采用任何字母,空格或连字符,并将其转换为数字1。问题在于它认为-9中的负号是“邪恶的文字”变成了一个数字。

解决此问题的一种方法是为正则表达式提供一个锚点 - 使其与文本周围的逗号(或字符串的开头/结尾)匹配。因此它会看到,text,并将其转换为,1,,但会看到,-9,并知道它不是文字。

另一种方法是根据“它包含数字”进行过滤,而不是“它是否包含我需要的这些东西” - 因为如果以后需要过滤掉其他标点符号?使用,[^0-9,]+,会匹配“不是数字或逗号的内容”,这会将,text,变为,1,但保持,-9,不变。

第三种方法是将字符串拆分为逗号,然后测试并更改每个单独的段 - 可能是为了查看它是否包含数字 - 然后再将它们连接在一起。

如果您选择第一种或第二种方法,我会留给您编写一个正则表达式,该正则表达式与前导逗号匹配字符串的开头(以及尾随逗号字符串的结尾 - 两者都相似)。这不是非常困难。