代码之家  ›  专栏  ›  技术社区  ›  user32882

在python中将困难字符串转换为列表格式

  •  0
  • user32882  · 技术社区  · 8 年前

    我有来自差异文件的字符串,这些字符串可以以多种方式出现:

    '@@ -1289,4 +1289,4 @@'
    
    '@@ -1289,2 +1289 @@'
    
    '@@ -1289 +1289,8 @@'
    

    我想通过使用 regex 或其他工具,以便我可以为每个案例输出如下列表

    [1289,4,1289,4]
    
    [1289,2,1289,0]
    
    [1289,0,1289,8]
    

    我试过玩弄 正则表达式 this website

    例如 (-\d+,\d+) (\+\d+,\d+) . 然而,我不知道当它不能匹配一个值时如何默认为零。我对regex很陌生,但我也开始怀疑这是否是我需要求助的工具。

    有什么优雅的方法可以做到这一点吗?谢谢

    7 回复  |  直到 8 年前
        1
  •  2
  •   freedev    8 年前
    @@\s*([\d,+-]+)\s+([\d,+-]+)\s*@@
    

    https://regex101.com/r/uKik9f/3

    正则表达式解释:

    • @@ 按字面意思匹配字符@(区分大小写)

    • \s* 匹配任何空白字符

      • * 量词在零次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪)
    • 第一捕获组 ([\d,+-]+) 匹配下表中的单个字符 [\d,+-]+

      • + 量词——匹配一次和无限次,匹配次数为 可能,根据需要回馈(贪婪)

      • \d 匹配数字(等于[0-9])

      • ,+-

    \s+ 匹配一个或多个空白字符

    第二个捕获组([\d,+-]+)和resti与前一部分类似

    全局模式标志 g 修改器:全局。所有比赛(第一场比赛后不返回)

        2
  •  1
  •   The fourth bird    8 年前

    您可以使用:

    '@@ -(\d+),?(\d*) \+(\d+),?(\d*)? @@'

    那会匹配的

    • 火柴 '@@ -
    • (\d+) 匹配捕获组中的一个或多个数字
    • ,? 可选逗号
    • (\d*) 匹配捕获组中的零个或多个数字
    • \+ 匹配空格和加号
    • (\d+) 匹配捕获组中的一个或多个数字
    • ,? 可选逗号
    • (\d*)? 匹配可选捕获组中的零个或多个数字
    • 火柴 @@'

    这将使用4个捕获组。如果缺少值,则组将为空。您可以检查代码中的空字符串,如果是,则添加一个零。

    Demo Python

        3
  •  1
  •   Anton Akhramovich    8 年前

    然而,我不知道当它不能匹配一个值时如何默认为零。

    这在纯regex中是不可能的(regex可以帮助您按模式查找,但不能使用任何逻辑修改找到的结果)

    此外,您可以尝试修改当前的正则表达式以捕获所有情况。

    (-\d+,?\d*) (\+\d+,?\d*)

        4
  •  1
  •   Ami Hollander    8 年前

    您可以按如下方式使用regex:

    re.findall(r"[\w']+", txt)

    例如:

    print(re.findall(r"[\w']+", '@@ -1289,4 +1289,4 @@'))
    > ['1289', '4', '1289', '4']
    

    请注意,对于第二个示例,它不适合,因为它将导致

    ['1289', '2', '1289']

    虽然您希望列表的长度为4,但为了支持这一点,您可以将零填充改为4,类似于:

    b = re.findall(r"[\w']+", '@@ -1289,2 +1289 @@')
    b = b + [0] * (4 - len(b))
    
    print(b)
    > ['1289', '2', '1289', 0]
    
        5
  •  1
  •   Vikas Periyadath Ramana Sriwidya    8 年前

    如果要为所有缺失的值匹配零,可以使用如下内容:

    @@ -(\d*),?(\d*) \+(\d*),?(\d*) @@
    

    如果不存在匹配项,则返回并清空字符串。在以后的代码中,您必须将其替换为零。

    然后,您的示例将输出:

    ['1289','4','1289','4']
    
    ['1289','2','1289','']
    
    ['1289','','1289','8']
    
        6
  •  1
  •   RomanPerekhrest    8 年前

    完整的解决方案 re.sub() + re.findall() 功能:

    import re
    
    diff_lst = ['@@ -1289,4 +1289,4 @@', '@@ -1289,2 +1289 @@', '@@ -1289 +1289,8 @@']
    
    sub_pat, find_pat = re.compile(r'([+-]\d+)\s'), re.compile(r'[+-](\d+),(\d+)')
    result = [[int(d) for t in find_pat.findall(sub_pat.sub('\\1,0', s)) for d in t]
               for s in diff_lst]
    
    print(result)
    

    输出:

    [[1289, 4, 1289, 4], [1289, 2, 1289, 0], [1289, 0, 1289, 8]]
    
        7
  •  1
  •   Mohideen bin Mohammed    8 年前

    这是你想要的,

    regex = '\-.+\+.+\d'
    
    
    >>> s
    '@@ -1289,4 +1289,4 @@'
    >>> re.search('\-.+\+.+\d', s).group().replace(',', ' ').split(' ')
    ['-1289', '4', '+1289', '4']
    >>> 
    
    • 在这里 re.search('\-.+\+.+\d', s).group() 我正在捕获变量中的数字。
    • 然后更换 , 使其平等。
    • 最后 split(' ') 用空格将给出整数列表