1

我可能有一个字符串:

"Foo Bar, FooTown, $100,00" 

现在我需要用逗号分割那个字符串,但这会错误地分割它,因为它也$100,00包含一个逗号。

所以我首先要查看字符串,是否有任何带逗号的数字,如果有,请将逗号替换为句号。所以它看起来像:

"Foo Bar, FooTown, $100.00"

编辑:

它总是很小的数字,不会超过一个,or .,但可能是 $1 $10 $100 $1000

字符串之前可能有也可能没有空格,

这是一条短信。

4

4 回答 4

7

您可以使用

>>> re.sub(r"(\d),(\d)", r"\1.\2", "Foo Bar, FooTown, $100,00")
'Foo Bar, FooTown, $100.00'
于 2012-08-08T18:05:17.170 回答
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模块的人感到非常抱歉......我见过这种很少使用的前瞻。

于 2012-08-08T18:15:22.547 回答
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 在评论中指出我的错误。

于 2012-08-08T18:17:15.760 回答
1

(\d),(\d)用RegEx 替换模式\1.\2将起作用。匹配任何数字,并且它周围的\d括号表示该数字将被记住并且\1将匹配第一个并且\2将匹配第二个。

于 2012-08-08T18:04:24.547 回答