需要一个金凤花regex模式不太贪婪,也不太自私

2024-05-15 14:37:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组字符串可能看起来像这样:

lines_ = ["04/04      1,000.00    Some word132:11bdkljas     14235262634235",
          "04/04        500.00    A simpler phrase           19058453049854",
          "04/04  1,000,000.00    Apply//erklj//1324:123"]

我正在尝试编写一个正则表达式来提取字符串的前三个“元素”。我意识到基于这个示例,我可以简单地使用re.split("\s{2,}"),然后只获取前三个元素,但是我不能保证输入总是有两个或更多的空格来分隔我想要的部分。所以我宁愿有一个更强大的正则表达式来抓住它。你知道吗

我试着用这个:

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+)(\s+\d+)"

它适用于前两个元素,但不适用于第三个元素,因为那里没有一组数字。所以我把它改成这样:

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+)(\s+\d+)?"

这适用于第三个元素,但对于前两个元素,它包括第四个元素作为第三个元素的一部分。所以我进一步调整它,使其看起来像这样:

r"(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+?)(\s+\d+)?"

认为?内部的(.+)会使它不那么贪婪,不会吞噬最后一个元素。相反,它给出了第三个元素中第一个单词的第一个字母,就这样。你知道吗

最后,我希望得到如下输出:

groups_ = [("04/04", "1,000.00", "Some word132:11bdkljas"),
           ("04/04", "500.00", "A simpler phrase"),
           ("04/04", "1,000,000.00", "Apply//erklj//1324:123")]

任何关于我在正则表达式中缺少什么的建议都将不胜感激。你知道吗


Tags: 字符串re元素示例数字somesplitapply
2条回答

这对你有什么用?你知道吗

import re
lines_ = ["04/04      1,000.00    Some word132:11bdkljas     14235262634235",
          "04/04        500.00    A simpler phrase           19058453049854",
          "04/04  1,000,000.00    Apply//erklj//1324:123"]

for i, line in enumerate(lines_):
    match = re.search(r'''
        (\d\d/\d\d)    # eg: 04/04
        \s+            # one or more spaces
        ([0-9.,]+)     # digits, with commas and decimal points
        \s+            # one or more spaces
        (.*?)          # "everything else" (non-greedy)
        (\s+\d+)?      # ... optionally followed by one or more 
                       # spaces and a bunch of digits
        $              # end of line
    ''', line, re.VERBOSE)

    if match:
        print i, match.groups()
    else:
        print i, None

当我运行以上命令时,我得到以下输出:

0 ('04/04', '1,000.00', 'Some word132:11bdkljas', '     14235262634235')
1 ('04/04', '500.00', 'A simpler phrase', '           19058453049854')
2 ('04/04', '1,000,000.00', 'Apply//erklj//1324:123', None)

将此模式与mg选项一起使用

(\d{2}/\d{2})\s+([\d,]+\.\d\d)\s+(.+?)(?:\s+(\d+)|,|$)  

Demo

相关问题 更多 >