【问题标题】:Python Regex - Find numbers with comma in stringPython Regex - 在字符串中查找带逗号的数字
【发布时间】:2012-08-08 17:59:21
【问题描述】:

我可能有一个字符串:

"Foo Bar, FooTown, $100,00" 

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

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

"Foo Bar, FooTown, $100.00"

编辑:

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

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

这是一条短信。

【问题讨论】:

  • 如果句点已被用作千位分隔符,例如 1.000.000,00(如在欧洲语言环境中所见),会发生什么情况?
  • 这些字符串是从哪里来的?在尝试解析格式损坏的字符串之前,我会先尝试修复那个
  • 不,在我的情况下不会发生。这将是这样的小数字
  • 所有逗号都不是以数字形式出现,后跟空格吗?如果是这样,您可以在", " 进行交流。
  • 不,is后面不会总是有空格

标签: python regex


【解决方案1】:

你可以使用

>>> re.sub(r"(\d),(\d)", r"\1.\2", "Foo Bar, FooTown, $100,00")
'Foo Bar, FooTown, $100.00'

【讨论】:

    【解决方案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 模块的人感到非常抱歉……我见过很少使用这种前瞻。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 语言错误 :) Python 中是 \1,而不是 $1,您必须使用原始字符串。
      • @SvenMarnach:啊,是的,我知道 RegEx,而不是 Python(嗯,不是特别好)。修复,虽然你的答案总是会更好。
      • 这个答案解释了他发生了什么,所以答案很好地互补。 :)
      【解决方案4】:

      与其修复数据,不如修复拆分?

      >>> import re
      >>> s = "Foo Bar, FooTown, $100,00"
      >>> re.split(r'(?<!\d),|,(?!\d)', s)
      ['Foo Bar', ' FooTown', ' $100,00']
      

      这使用否定的前瞻和后瞻断言来确保逗号不被数字包围。

      编辑: 将正则表达式从 r'(?&lt;!\d),(?!\d)' 更改为 r'(?&lt;!\d),|,(?!\d)' 以正确处理诸如“$100,00, Foo Bar, FooTown”之类的字符串。感谢 BorrajaX 指出我在 cmets 中的错误。

      【讨论】:

      • 我也这么认为,但我认为它不会正确拆分像“$ 100,00,Foo Bar,FooTown”这样的字符串,其中要拆分的逗号就在一个数字之后,是对吗?
      • @Borrajax:很好。我改变了正则表达式来处理这个问题。
      • 我也是。我有一个与你类似的想法 :-D 我喜欢看到有人在使用前瞻功能...我没有看到它使用得太多...但人们似乎不喜欢我的答案 :_(
      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多