【发布时间】: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
感谢您的帮助。
【问题讨论】: