我可能有一个字符串:
"Foo Bar, FooTown, $100,00"
现在我需要用逗号分割该字符串,但这会错误地拆分它,因为$100,00
也包含逗号。
所以我首先要查看字符串,是否有逗号的数字,如果有,请用逗号替换逗号。所以它看起来像:
"Foo Bar, FooTown, $100.00"
它总是小数字,不会超过一个,
或.
,但它可能是$ 1 $ 10 $ 100 $ 1000
字符串在,
这是一条短信。
答案 0 :(得分:7)
您可以使用
>>> re.sub(r"(\d),(\d)", r"\1.\2", "Foo Bar, FooTown, $100,00")
'Foo Bar, FooTown, $100.00'
答案 1 :(得分:2)
你也可以使用负向前瞻......那些超级强大的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模块的人感到非常抱歉......我看到这些前瞻用品几乎没有用过。
答案 2 :(得分:1)
使用(\d),(\d)
的模式\1.\2
的RegEx替换将起作用。 \d
匹配任何数字,其周围的括号表示该数字将被记住,\1
将与第一个匹配,\2
将与第二个匹配。
答案 3 :(得分:1)
为什么不修复分割,而不是修复数据?
>>> 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在评论中指出了我的错误。