【问题标题】:Regex pattern using muiltiple groups which may or may not exist with text inbetween使用多个组的正则表达式模式,这些组可能存在也可能不存在,中间有文本
【发布时间】:2014-05-04 19:14:34
【问题描述】:

我在字符串列表(一次一个字符串)上使用正则表达式来提取与字符串有关的信息。我有一个几乎可以正常工作的模式,它适用于我可能会传递给它的所有可能的事件,除了一个。我对正则表达式相当陌生,因此我开始发现它无法处理,尤其是当模式变得更加复杂时。我有多个可能的字符串要匹配,除了一个之外,它们都可以工作。

以下是可能的字符串,以行分隔。格式一致,但名称、分数、附加信息等内容不一致。

Goal scored Sunderland 4, Cardiff City 0. Connor Wickham (Sunderland) header from the centre of the box to the bottom left corner. Assisted by Emanuele Giaccherini with a cross following a corner.
Booking Sebastian Larsson (Sunderland) is shown the yellow card.
Foul by Jordon Mutch (Cardiff City).
Dismissal Cala (Cardiff City) is shown the red card.
Penalty conceded by Cala (Cardiff City) after a foul in the penalty area.

除了目标之外,它们都遵循相同的格式,因此可以使用我当前的模式,但是我希望目标字符串也可以使用,但这不会是由于团队名称的大写。理想情况下,我想将球队名称和得分分成两个不同的组,主队和客队,尽管这不是完全必要的。

这是我当前的正则表达式模式,除了目标之外,它还能正确检测事件、球员姓名、球队和任何额外的信息。我最初有.* 而不是'[A-Z]*',它在目标上起作用,但总是切断球员的名字,我认为这是因为它在组内是可选的。

(?P<event>\A\w+)[^A-Z]*(?P<playername>(?:[A-Z]\w+)*\s\w+\s)(?P<team>\(.+\))(?P<extrainfo>[^\Z.]+)*

为了打破这个,这就是我目前正在寻找的东西

出现的第一个词,在事件组(?P<event>\A\w+)

任意数量的非大写字符(初始原因目标被破坏)[^A-Z]*

一个玩家名字,可以是任意长度(有些名字是单数,有些有多个部分,因此不匹配的组可以检测任何名字)(?P<playername>(?:[A-Z]\w+)*\s\w+\s)

一个队名,总是用括号括在球员名(?P<team>\(.+\))之后

关于赛事的任何额外信息,以及球队名称之后的任何信息。我确保还检查它不仅仅是.,以确保匹配组(?P<extrainfo>[^\Z.]+)*的结果中没有任何内容@

我目前正在尝试按照[^A-Z.]*(?P<hometeam>\w+[^,.])*(?P<awayteam>\w+[^,.])* 的方式寻找解决方案,但这不起作用,我正在苦苦挣扎。

另一个微不足道的任务,但如果可能的话,我想添加将以某种方式从团队名称组中删除括号,以便将 teamname (Cardiff City) 改为 teamname Cardiff City

感谢您的帮助。

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    我建议把它分成两个任务:

    1. 提取进球数(r"^(?P<event>goal scored) (?P<hometeam>.*) (?P<homescore>\d), (?P<awayteam>.*) (?P<awayscore>\d). (?P<playername>.*) \((?P<scoringteam>.*)\).*$");和
    2. 提取其他事件 (r"^(?P<event>booking|foul|dismissal|penalty conceded) (?:by )?(?P<playername>.*) \((?P<teamname>.*)\).*$")。

    在您的示例中,前者匹配:

    event   [0-11]  `Goal scored`
    hometeam    [12-23] `Sunderland`
    homescore   [23-24] `4`
    awayteam    [26-39] `Cardiff City`
    awayscore   [39-40] `0`
    playername  [42-56] `Connor Wickham`
    scoringteam [58-68] `Sunderland`
    

    还有后者,例如:

    event   [197-204]   `Booking`
    playername  [205-222]   `Sebastian Larsson`
    teamname    [224-234]   `Sunderland`
    

    【讨论】:

    • 一个非常简单和伟大的解决方案,出于兴趣将结尾更改为 .*$ 导致在犯规的情况下也收集.?解决方案缺少额外的信息组,我将保留这些信息组,但我可以自己添加,没有任何问题。感谢您的回复!
    • @Excessum 如果您按照我的答案中的链接进行操作,您可以使用正则表达式并确切了解它们将在您的示例中做什么。
    猜你喜欢
    • 2018-01-21
    • 2015-07-07
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多