正则表达式匹配逗号或换行符,但不能同时匹配两者

Posted

技术标签:

【中文标题】正则表达式匹配逗号或换行符,但不能同时匹配两者【英文标题】:Regular expression to match comma or newline but not both 【发布时间】:2012-05-13 21:13:59 【问题描述】:

以下 python 脚本存在问题,该脚本从公司内部网络应用文本区域的文本中提取一些选项。

import re

text = 'option one\noption two, option three, option four'
correct = 'option one, option two, option three, option four'

pattern = re.compile('(\s*[,]\s*)')
fixed = pattern.sub(', ', text)

print fixed
option one
option two, option three, option four

print fixed.split(', ')
['option one\noption two', 'option three', 'option four']

这显然无法将“选项一\n选项二”拆分为“选项一”、“选项二”

所以输入最终可能是

option one
option two, option three, option four

需要转换成

option one, option two, option three, option four

如果是逗号,它可以正常工作

逗号后跟换行符

但如果它本身只是一个换行符,则不是。

【问题讨论】:

【参考方案1】:

将你的角色类别从[,] 扩展到[,\n],也许吧?另外,为什么不直接在正则表达式上拆分,而不是先搜索替换再拆分?这个函数:http://docs.python.org/library/re.html?highlight=re.split#re.split 可以派上用场。

【讨论】:

re.split 确实是答案。 我什至从未注意到这种稍微奇怪的拆分方法!但无论如何我不是pythonite...... :) 不错,'(\s*[,\n]\s*)' 完美运行,感谢 tdammers :-) 我刚刚看过 re.split,我以前也从未见过。它显然比我的尝试更明智。我试过 re.split('(\s*[,\n]\s*)', text) 并将所有逗号作为数组项返回,例如['选项一', ', ', '选项二', ', ', '选项三', ', ', '选项四']。知道为什么会这样吗? 那是因为您使用的是捕获组。去掉括号,它应该可以工作 - 也就是说,'\s*[,\n]\s*' 而不是 '(\s*[,\n]\s*)'【参考方案2】:

你可以试试

(\s*(,|\n)\s*)

?

或许更好

(\s*[,\n]\s*)

...我总是忘记您可以将\n 放在字符类中...

【讨论】:

啊,对不起,我没有注意到你先给出了正确的答案,发生这种情况时“完成的事情”是什么?我不知道,因为这是我的第一个问题...... @nih 这不是问题。虽然我会说 tdammers 给了你一个更完整的答案,因为他们建议你在比赛中简单地分裂。如果里面什么都没有,那么我通常把它给谁得到最少的代表:D【参考方案3】:

我在没有正则表达式的情况下到达那里:

print [x.strip() for x in text.replace('\n', ', ').split(', ')]

结果:

['option one', 'option two', 'option three', 'option four']

我并不是说这对您的用例来说是一个很好的答案。如果您需要添加额外的分隔符,则意味着为每个分隔符添加一个额外的.replace()

【讨论】:

以上是关于正则表达式匹配逗号或换行符,但不能同时匹配两者的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,匹配特定字符后面的内容

ORACLE 用正则表达式匹配 回车换行

求教正则表达式如何匹配

Linux 正则表达

Linux 正则表达

基础正则表达式