我有以下类似的文件:
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)
但事实并非如此:
[]
有人可以告诉我这里做错了吗?
答案 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,
不变。
第三种方法是将字符串拆分为逗号,然后测试并更改每个单独的段 - 可能是为了查看它是否包含数字 - 然后再将它们连接在一起。
如果您选择第一种或第二种方法,我会留给您编写一个正则表达式,该正则表达式与前导逗号或匹配字符串的开头(以及尾随逗号或字符串的结尾 - 两者都相似)。这不是非常困难。