【问题标题】:How do I print exact sentence by filtering using regular expression in Python如何通过在 Python 中使用正则表达式过滤来打印准确的句子
【发布时间】:2021-08-24 05:02:39
【问题描述】:

我是正则表达式的新手,被下面的代码卡住了。

import re
s = "5. Consider the task in Figure 8.11, which are balanced in fig 99.2"
output = re.findall((r'[A-Z][a-z]*'), s)[0]
output2 = re.findall(r'\b[^A-Z\s\d]+\b', s)

mixing = " ".join(str(x) for x in output2)
   

finalmix = output+" " + mixing
print(finalmix)

这里我试图从给定的字符串 s' 中打印“考虑图 8.11 中的任务,在图 99.2 中平衡”作为输出中的句子。因此,我在最后使用 join 语句将两个输出连接起来,将其作为一个句子。但现在它很混乱,因为“图 8.11”和“图 99.2”将不会被打印,因为我没有为此提供正则表达式代码,因为我无法确定我应该使用什么正则表达式,然后在最后组合它。

这可能是因为我使用错误的方法从字符串 s 打印给定的句子。如果有人可以帮助我修复代码或指导我使用其他方法,我会很高兴,因为这段代码看起来很荒谬。

这是我得到的输出:

Consider the task in . which are balanced in .

【问题讨论】:

    标签: python-3.x regex


    【解决方案1】:

    要捕获所有项目符号,我会使用:

    import re
    s = "5. Consider the task in Figure 8.11, which are balanced in fig 99.2"
    items = re.findall(r'\d+\.(?!\d)(.*?)(?=\d+\.(?!\d)|$)', s, flags=re.DOTALL)
    print(items)
    

    打印出来:

    ['Consider the task in Figure 8.11, which are balanced in fig 99.2']
    

    下面是正则表达式模式的解释:

    \d+\.              match a bulleted number
    (?!\d)             which is NOT followed by another number
    (.*?)              match and capture all content, across newlines, until hitting
    (?=\d+\.(?!\d)|$)  another number bullet OR the end of the input
    

    【讨论】:

    • 非常感谢!看起来我只知道 regex 的基础知识。我从来没有使用过你在这里提到的一些术语,我认为这就是我让这看起来如此困难的原因。我一定会从中吸取教训:)
    • 我们可以在一个句子中使用多个正则表达式吗?就像假设字符串每次都变化一样。如果我下次必须找到这个“5.考虑图8.11中的任务,在问题中的图99.2中平衡”?我可以使用“或”语句并给出两个正则表达式代码吗?正则表达式可以同时管理多个正则表达式吗?希望你能理解:)
    • 我不关注,因为我不知道您要使用的替代起始文本。
    • 我们可以在一个句子上同时使用多个正则表达式吗?如果我第一次使用“5.考虑图 8.11 中的任务,在问题中的图 99.2 中平衡”作为字符串,那么我使用“5.考虑图 8.11 中的任务,它们在图 99.2 中平衡”。这将需要不同的正则表达式代码。我可以使用多个正则表达式,这样如果每次都有不同的字符串我就不需要再次编写正则表达式代码了吗?
    • 嗯...默认情况下,对re.findall 的调用将找到尽可能多的匹配项。至于正则表达式,它适用于查找单个编号的项目符号。
    【解决方案2】:

    @TimBiegeleisen 的回答有效,但有点冗长,因为使用 re.findall 需要重复项目符号点的模式作为开始和最后的前瞻。

    为了在重复模式(本例中为要点)之间查找字符串,使用re.split 可能更简单。切片结果列表以丢弃第一项,因为我们不需要第一个项目符号点之前的内容:

    re.split(r'\d+\.(?!\d)\s*', s)[1:]
    

    这会返回:

    ['Consider the task in Figure 8.11, which are balanced in fig 99.2']
    

    【讨论】:

    • 谢谢 :) 我不知道正则表达式中有这么多方法可以解决这个问题
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多