Python 正则表达式模式,使用可能存在或可能不存在的多个组,其中包含文本

Python 正则表达式模式,使用可能存在或可能不存在的多个组,其中包含文本,python,regex,string,Python,Regex,String,我在字符串列表上使用正则表达式(一次一个字符串)来提取与字符串相关的信息。我有一个几乎可以运行的模式,它可以处理所有可能的事件,我可能会传递到它,除了一个。我对Regex相当陌生,因此我开始发现它不可能处理,尤其是当模式变得更加复杂时。我有多个可能的字符串要匹配,除了一个之外,它们都可以工作 以下是可能的字符串,以行分隔。格式一致,但姓名、分数和其他信息等内容不一致 Goal scored Sunderland 4, Cardiff City 0. Connor Wickham (Sunderl

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

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

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\A\w+[^A-Z]*(?p(?[A-Z]\w+*\s\w+\s)(?p\(.+\)(?p[^\Z.]+)*

为了解决这个问题,这就是我目前正在努力寻找的

出现的第一个单词位于事件组
(?p\A\w+

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

一个球员的名字,可以是任意长度(一些名字是单数的,其他的有多个部分,因此不匹配的组可以检测任何名字)
(?p(?[a-Z]\w+)*\s\w+\s)

球员姓名
(?p\(.+\)

任何关于活动的额外信息,以及团队名称之后的任何信息。我还确保检查它不仅仅是一个
,以确保匹配组的结果中没有
(?P[^\Z.]+)*

我目前正试图按照
[^a-Z.]*(?p\w+[^,.])*(?p\w+[^,.])*
的思路找到解决方案,但这不起作用,我正在努力

另一项任务很简单,但如果可能的话,我想添加的是从teamname组中删除括号,这样它就不是
teamname(加的夫市)
而是
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`
    

    一个非常简单而伟大的解决方案,出于兴趣,在犯规的情况下,将结束改为。*$会导致收集
    ?解决方案缺少额外的信息组,我将保留该组,但我可以自己添加该组,而不会出现任何问题。谢谢你的回复@如果您按照我的答案中的链接进行操作,您可以使用正则表达式,查看它们在您的示例中的具体作用。