【问题标题】:Python split a string using regexPython使用正则表达式拆分字符串
【发布时间】:2013-04-26 04:48:02
【问题描述】:

我想用 ':' 和 ' ' 字符分割字符串。但是,我想忽略两个空格“”和两个冒号“::”。例如

text = "s:11011 i:11010 ::110011  :110010 d:11000"

应该拆分成

[s,11011,i,11010,:,110011, ,110010,d,11000]

在遵循 python 网站上的正则表达式 HOWTO 之后,我设法想出了以下内容

regx= re.compile('([\s:]|[^\s\s]|[^::])')
regx.split(text)

但是,这并没有按预期工作,因为它在 : 和空格上拆分,但它仍然在拆分中包含 ':' 和 ' '。

[s,:,11011, ,i,:,11010, ,:,:,110011, , :,110010, ,d,:,11000]

我该如何解决这个问题?

编辑:如果是双倍空格,我只希望出现一个空格

【问题讨论】:

  • 如果您想避免双倍空格,为什么您提供的列表中有空格作为预期输出?你也只是在寻找一个正则表达式的答案吗?
  • 对不起,我的意思是在双倍空格的情况下,我只希望出现一个空格。并且没有解决方案不必是正则表达式答案
  • 这个模式看起来像 ((\s?).(:)[0-1]+)*---> 拆分组 1 和组 2

标签: python regex string split


【解决方案1】:

请注意,这假设您的数据格式类似于 X:101010:

>>> re.findall(r'(.+?):(.+?)\b ?',text)
[('s', '11011'), ('i', '11010'), (':', '110011'), (' ', '110010'), ('d', '11000')]

然后chain他们:

>>> list(itertools.chain(*_))
['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000']

【讨论】:

    【解决方案2】:
    >>> text = "s:11011 i:11010 ::110011  :110010 d:11000"
    >>> [x for x in re.split(r":(:)?|\s(\s)?", text) if x]
    ['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000']
    

    【讨论】:

      【解决方案3】:

      使用正则表达式(?<=\d) |:(?=\d)进行拆分:

      >>> text = "s:11011 i:11010 ::110011  :110010 d:11000"
      >>> result = re.split(r"(?<=\d) |:(?=\d)", text)
      >>> result
      ['s', '11011', 'i', '11010', ':', '110011', ' ', '110010', 'd', '11000']
      

      这将拆分:

      (?&lt;=\d) 一个空格,当左边有一个数字时。要检查这一点,我使用lookbehind assertion

      :(?=\d) 一个冒号,当右边有一个数字时。要检查这一点,我使用lookahead assertion

      【讨论】:

        【解决方案4】:

        看看这个模式:

        ([a-z\:\s])\:(\d+)
        

        它将为您提供您期望的相同数组。无需使用拆分,只需访问正则表达式引擎返回的匹配项即可。

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-23
          相关资源
          最近更新 更多