【问题标题】:Python formatting elements in an array with regexPython 使用正则表达式格式化数组中的元素
【发布时间】:2018-12-18 12:52:22
【问题描述】:

使用 Python 2.6.6,我正在尝试使用正则表达式格式化列表中的每个元素。

数组元素示例:

test1;apple;-fgnsldfgsbfdgb
test2;watermelon;-iwerunvfgkjsfg
test3;orange;wervxddgjbdhnf

我想格式化文本以获取分号之间的内容;

apple
watermelon
orange

要捕获的正则表达式如下:

(?<=\;)(.*?)(?=\;)

我尝试了以下代码的不同变体:

for member in fruits:
    parseFruit = re.compile(member)
    member = member.sub( (\.),((?<=\;)(.*?)(?=\;)) )
    print("Fruit: ", member)

似乎没有任何效果......

【问题讨论】:

    标签: python arrays regex scripting


    【解决方案1】:

    对于您的示例数据,您可以使用不带捕获组的搜索而不是 sub 来获取第一个匹配项。

    (?&lt;=;).*?(?=;)

    fruits = ['test1;apple;-fgnsldfgsbfdgb',
    'test2;watermelon;-iwerunvfgkjsfg',
    'test3;orange;wervxddgjbdhnf']
    
    for member in fruits:
        print ("Fruit: " + re.search("(?<=;).*?(?=;)", member).group(0))
    

    Demo

    如果你想使用sub,你可以从字符串的开头匹配到;的第一次出现,然后也匹配那个。或者匹配最后一次出现的 ; 直到字符串的末尾。然后用空字符串替换它。

    ^[^;]+;|;[^;]+$

    for member in fruits:
        print("Fruit: " + re.sub(r'^[^;]+;|;[^;]+$', '', member))
    

    Demo

    【讨论】:

    • 对不起,我最初在标题中写了列表,但它应该是数组。我不确定这是否会改变任何东西,但当我尝试它时,它打印得很好,但改变没有保留。
    • 这很好用!我必须添加一个“member =”而不是“print”来保持更改,谢谢!
    • 实际上,当我执行 print(fruits) 时,它会以原始方式打印...是否有我缺少的写入或保存命令?
    • @Awsmike 在示例中,打印了每个操作的结果,但未修改水果本身。如果您想更改 fruits,您可以使用 map (Demo) 或将结果存储在新列表中 (Demo)
    • 谢谢,我最终这样做了,为任何感兴趣的人创建了一个新列表并使用 newlist.append(member)...
    【解决方案2】:
    import re
    
    s = """test1;apple;-fgnsldfgsbfdgb
    test2;watermelon;-iwerunvfgkjsfg
    test3;orange;wervxddgjbdhnf"""
    
    fruits = re.findall(r';(.*?);', s)
    
    for fruit in fruits:
        print('Fruit: %s' % fruit)
    
    #fruits is ['apple', 'watermelon', 'orange']
    

    输出:

    Fruit: apple
    Fruit: watermelon
    Fruit: orange
    

    【讨论】:

    • 对不起,我最初在标题中写了列表,但它应该是数组。我不确定这是否会改变任何东西,但是当我尝试它时,它打印得很好,但改变并没有保留
    • 在变量fruits 中有['apple', 'watermelon', 'orange']
    【解决方案3】:

    或者,您可以使用 split 函数而不是使用正则表达式

    FruitList= ['test1;apple;-fgnsldfgsbfdgb', 'test2;watermelon;-iwerunvfgkjsfg', 'test3;orange;wervxddgjbdhnf']
    Fruits= [i.split(';')[1::2] for i in FruitList]
    

    [['apple'], ['watermelon'], ['orange']]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多