我可能有一个字符串:
"Foo Bar, FooTown, $100,00"
现在我需要用逗号分割那个字符串,但这会错误地分割它,因为它也$100,00包含一个逗号。
所以我首先要查看字符串,是否有任何带逗号的数字,如果有,请将逗号替换为句号。所以它看起来像:
"Foo Bar, FooTown, $100.00"
编辑:
它总是很小的数字,不会超过一个,or .,但可能是 $1 $10 $100 $1000
字符串之前可能有也可能没有空格,
这是一条短信。
您可以使用
>>> re.sub(r"(\d),(\d)", r"\1.\2", "Foo Bar, FooTown, $100,00")
'Foo Bar, FooTown, $100.00'
你也可以使用负前瞻...那些在超级强大的 Python 正则表达式机制中被遗忘的东西...
您可以制作一个正则表达式,以逗号分隔,逗号前面没有数字或后面没有数字。
#!/usr/bin/env python
import re
samples=[
"Foo Bar, FooTown, $100,00",
"$100,00, Foo Bar, FooTown",
"Foo Bar, $100,00, FooTown",
"$100,00, Foo Bar, FooTown,",
]
myRegex=re.compile(",(?!\d)|(?<!\d),")
for sample in samples:
print "%s sample splitted: %s (%s items)" % (sample, myRegex.split(sample), len(myRegex.split(sample)))
输出:
Foo Bar, FooTown, $100,00 sample splitted: ['Foo Bar', ' FooTown', ' $100,00'] (3 items)
$100,00, Foo Bar, FooTown sample splitted: ['$100,00', ' Foo Bar', ' FooTown'] (3 items)
Foo Bar, $100,00, FooTown sample splitted: ['Foo Bar', ' $100,00', ' FooTown'] (3 items)
$100,00, Foo Bar, FooTown, sample splitted: ['$100,00', ' Foo Bar', ' FooTown', ''] (4 items)
我为在 Python 中开发re模块的人感到非常抱歉......我见过这种很少使用的前瞻。
与其修复您的数据,不如修复您的拆分?
>>> import re
>>> s = "Foo Bar, FooTown, $100,00"
>>> re.split(r'(?<!\d),|,(?!\d)', s)
['Foo Bar', ' FooTown', ' $100,00']
这使用否定的前瞻和后瞻断言来确保逗号不被数字包围。
编辑:将正则表达式从更改r'(?<!\d),(?!\d)'为r'(?<!\d),|,(?!\d)'正确处理“$100,00, Foo Bar, FooTown”等字符串。感谢 BorrajaX 在评论中指出我的错误。
(\d),(\d)用RegEx 替换模式\1.\2将起作用。匹配任何数字,并且它周围的\d括号表示该数字将被记住并且\1将匹配第一个并且\2将匹配第二个。