正则表达式匹配逗号或换行符,但不能同时匹配两者
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()
。
【讨论】:
以上是关于正则表达式匹配逗号或换行符,但不能同时匹配两者的主要内容,如果未能解决你的问题,请参考以下文章