使用Python的正则表达式';s Re

使用Python的正则表达式';s Re,python,regex,Python,Regex,我的以下文件中有很多类似的行: 行='Weclome-MIsiti International,0,0,-9,0,' 我想用字符串'1'替换'Weclome-MIsiti International' 这是我的密码: 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\-[^

我的以下文件中有很多类似的行:

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

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

这是我的密码:

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)
但它没有:

[]

有人能告诉我这里做错了什么吗?

字符类不能嵌套。后一个示例将吃“[”、“^”等。如果您只是简单地吃了r“(^[^,0-9]+”,即开始时任何东西都不是commaor 0-9,它会不起作用吗

exp=re.compile(r"([\./A-Za-z\s\-]+)"
无需在括号之间的'-'之前加上'\'。将'-'放在括号之间没有特殊含义的地方

此外,无需在括号之间的点'\'之前加上'.,因为括号之间的点失去了它的特殊含义

因此,与其写
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...
中第一个左括号的结束括号,最后一个右括号后跟“+”表示“字符]至少一次,可能更多”

结果

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

为什么需要正则表达式

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

您的第一个正则表达式很好,但您需要将其锚定到行的开头,并添加“m”多行修饰符,如下所示:

重新导入
行='Weclome-MIsiti International,0,0,-9,0,'
exp=re.compile(r“^([./A-Za-z\s\-]+)”,re.M)
打印(exp.sub(“1”,行))

请注意,此解决方案在一次操作中修复了整个文件中的所有行。

大多数人都会给您答案
通常以“不要使用正则表达式!正则表达式是邪恶的,来自Perl!我们Python用户只进行了文本操作!”
,但没有人解释您遇到此问题的原因

你的正则表达式起作用了。它接受任何字母、空格或连字符,并将其转换为数字
1
。问题是,它认为
-9
中的负号是“邪恶文本”,可以变成数字

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

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

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


如果您选择第一种或第二种方法,我将让您自己编写一个正则表达式,该正则表达式要么匹配前导逗号,要么匹配字符串的开头(以及尾随逗号或字符串的结尾,两者都类似)。这并不十分困难。

您是否尝试过使用负前瞻来解决连字符问题?我尝试了一下,但没有成功地让它工作。您的第一个正则表达式正按照您所说的那样工作(即用字符串
“1”
替换:
'Weclome-MIsiti International'
)。你能更明确地说明你真正想要它做什么吗?@ridgerunner他的正则表达式可以替换第一部分,但它也可以用'19'替换'-9'。eyquem:是的,非常正确。谢谢。不,你不需要使用正则表达式。但是regex解决方案可以在一次操作中修复整个文件中的所有行。(我很想知道哪个更快?)这里有一个使用正则表达式的想法,但不是唯一的:
line=','.join(map(lambda x:x如果re.match(r“\d))或者'1',line.split(','))
@ridgerunner,所以可以进行正常的字符串操作。@Chris,也许你应该把它作为你自己的答案发布。有趣。最初尝试过吐痰,但没有意识到“加入”是解决方案。谢谢你-1:我看不出“大多数人给你的答案通常带有”不要使用正则表达式!正则表达式是邪恶的,它来自Perl!我们Python用户已经结束了单纯的文本操作!“”(目前还有4个答案:你指的是哪3个?@J.F.塞巴斯蒂安-我太傻了。我认为
暗示了幽默和讽刺。好吧,如果没有明确的
#不想成为事实陈述
>>> line = 'Weclome - MIsiti International,0,0,-9,0,'
>>> s=line.split(",")
>>> s[0]="1"
>>> ','.join(s)
'1,0,0,-9,0,'