我在字符串列表中使用Regex(一次一个字符串),以便提取与字符串有关的信息。我有一个几乎起作用的模式,它可以处理我可能传递给它的所有可能事件,除了一个。我对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<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
感谢您的帮助。
答案 0 :(得分:0)
我建议将其分为两个任务:
r"^(?P<event>goal scored) (?P<hometeam>.*) (?P<homescore>\d), (?P<awayteam>.*) (?P<awayscore>\d). (?P<playername>.*) \((?P<scoringteam>.*)\).*$"
);和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`