【问题标题】:how to split a string on the first instance of delimiter in python如何在python中分隔符的第一个实例上拆分字符串
【发布时间】:2012-06-16 01:44:58
【问题描述】:

我需要使用 python 拆分字符串,但仅限于字符串中分隔符的第一个实例。

我的代码:

for line in conf.readlines():
    if re.search('jvm.args',line):
        key,value= split('=',line)
        default_args=val

问题是line,其中包含jvm.args看起来像这样:

'jvm.args = -Dappdynamics.com=true, -Dsomeotherparam=false,'

我希望我的代码在第一个“=”时将jvm.args 拆分为键和值变量。 re.split 默认情况下会这样做吗?如果没有建议将不胜感激!

【问题讨论】:

  • 既然您只对第一个分隔符感兴趣,为什么不通过扫描字符串找到分隔符的匹配项呢?然后你可以用 line[:pos] 和 line[pos+1:] 提取两个切片。
  • @user1371011 预期输出?
  • 你不需要readlines(),在内存中存储一​​个不必要的列表。只需执行以下操作即可遍历每一行:for line in conf

标签: python regex string


【解决方案1】:

我认为这应该可行:

lineSplit = line.split("=")
key = lineSplit[0]
value = "=".join(lineSplit[1:])

正如 cmets 中有人建议的那样:您可以只解析一次字符串并找到 "=" ,然后从该点拆分它。

【讨论】:

  • -1 value = ','.join((key,"=".join(lineSplit[1:]))) 是正确的做法。
  • 在 python 中鼓励使用names_with_underscores。
  • @jamylak 我在 java 和 python 之间切换太频繁了,这是我遵循的模式 :) 感谢您的建议!
  • @AshwiniChaudhary 问题是“我需要使用 python 拆分字符串,但仅在字符串中分隔符的第一个实例上。”我的代码也是如此。不过,您所写的内容提供了更明确的参数分离。
【解决方案2】:

正如您在previous question 中所建议的那样,ConfigParser 是最直接的方法:

import ConfigParser

from io import StringIO

conf = u"""
[options]
foo=bar
jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false, 
"""

config = ConfigParser.ConfigParser()
config.readfp(StringIO(conf))
print config.get('options', 'jvm.args')

【讨论】:

    【解决方案3】:

    来自split documentation

    str.split([sep[, maxsplit]])

    返回字符串中的单词列表,使用 sep 作为分隔符字符串。 如果给定了 maxsplit,则最多完成 maxsplit 拆分(因此,列表将有 最多 maxsplit+1 个元素)

    >>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.split('=',1)
    ['jvm.args', ' -Dappdynamics.com=true, -Dsomeotherparam=false,']
    

    【讨论】:

      【解决方案4】:

      我想我会把我的评论变成(未经测试的)代码,因为它可能在低于str.partition() 的级别上有用。例如,对于需要正则表达式的更复杂的分隔符,您可以使用re.match() 来查找pos。但是三联画的建议得到了我的投票。

      给你:

      pos = -1
      for i, ch in enumerate(line):
          if ch == '=':
              pos = i
              break
      if pos < 0: raise myException()
      
      key = line[:pos]
      value = line[pos+1:]
      

      【讨论】:

        【解决方案5】:

        我会完全跳过使用正则表达式,对于简单的字符串比较,它们并不是真正需要的。

        示例代码使用内联方法生成键值元组,dict 内置用于生成字典(我没有打扰文件迭代代码,您的示例在那里是正确的):

        line="jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false, "
        
        # Detect a line that starts with jvm.args
        if line.strip().startswith('jvm.args'):
            # Only interested in the args
            _, _, args = line.partition('=')
        
            # Method that will yield a key, value tuple if item can be converted
            def key_value_iter(args):
                for arg in args:
                    try:
                        key, value = arg.split('=')
                        # Yield tuple removing the -d prefix from the key
                        yield key.strip()[2:], value
                    except:
                        # A bad or empty value, just ignore these
                        pass
        
            # Create a dict based on the yielded key, values
            args = dict(key_value_iter(args.split(',')))
        

        打印参数将返回:

        {'appdynamics.com': 'true', 'someotherparam': 'false'}
        

        我认为这就是你真正追求的;)

        【讨论】:

          【解决方案6】:

          这就是str.partition 的用途:

          >>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.partition('=')
          ('jvm.args', '=', ' -Dappdynamics.com=true, -Dsomeotherparam=false,')
          

          来自文档:

          str.partition(sep)

          在第一次出现 sep 时拆分字符串, 并返回一个 3 元组,其中包含分隔符之前的部分,即 分隔符本身,以及分隔符之后的部分。如果分隔符 没有找到,返回一个包含字符串本身的三元组,后面跟着 通过两个空字符串。

          2.5 版中的新功能。

          【讨论】:

          • @BurhanKhalid 是的,partition 已为此进行了优化。
          猜你喜欢
          • 2013-08-30
          • 2013-02-07
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          • 1970-01-01
          • 2023-03-08
          • 2016-04-29
          相关资源
          最近更新 更多