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