正则表达式匹配两个单词之间的多行文本,包括单词

时间:2015-03-11 14:17:28

标签: python regex perl

我正在编辑字典并尝试将每个发音标记[s]...[/s]放在转录标记[c darkslategray]...[/c]之后。问题是并非所有单词都包含发音和转录。

这是我现在的正则表达式和字典的一部分:

(\s\[s\].*?\[\/s\])
(?s)(\s.*?\[c darkslategray\].*?\[\/c\])

然后替换为$2$1以移动代码。

contrast
 [s]contra62.wav[/s]
    [b]con·trast[/b]
    [c blue][b]I[/b][/c]
    [m1]({{<vr>}}[p]or[/p] [b]A[/b]{{</vr>}})[c darkslategray]/kənˈtræst, [i]Brit[/i] kənˈtrɑːst/[/c] [p]verb[/p]
    [m2][b]1[/b] \[[p]no obj[/p]\] [b]:[/b] to be different especially in a way that is very obvious[/m]
repellency
 [s]repell01.wav[/s]
    [m1][b]re·pel·len·cy[/b] [c darkslategray]/rıˈpɛlənsi/[/c] [p]noun[/p] \[[p]noncount[/p]\][/m]
    [m2][*][ex]a fabric known for its water [i]repellency[/i][/ex][/*][/m]
labyrinth
 [s]labyri01.wav[/s]
charge card
    [m1][p]noun[/p], [p]pl[/p] [b]⋯ cards[/b] \[[p]count[/p]\]
    [m2][b]:[/b] ↑<<credit card>>[/m]
Antarctic
 [s]gganta10.wav[/s]
    ↑<<antarctic>>
ant
 [s]ant00001.wav[/s]
    [m1][c darkslategray]/ˈænt/[/c] [p]noun[/p], [p]pl[/p] [b]ants[/b] \[[p]count[/p]\]
    [m2][b]:[/b] a kind of small insect that lives in an organized social group[/m]
    [m3][*][ex]a colony of [i]ants[/i] = an [i]ant[/i] colony[/ex][/*][/m]
ring
 [s]ring0004.wav[/s]

Regex101示例:https://regex101.com/r/cG3yK3/5

正如你所看到的,前两场比赛很好,但第三场比赛不是我想要的。它捕获一个单词的发音和另一个单词的转录。有没有办法解决它?

1 个答案:

答案 0 :(得分:3)

你的正则表达式应该有一个负向前瞻,以确保没有匹配的嵌套[s]...[/s]。使用此正则表达式:

(\s\[s\].*?\[\/s\])
(?s)(\s(?:(?!\[s\].*?\[\/s\]).)*?\[c darkslategray\].*?\[\/c\])

Updated RegEx Demo