到达仅包含大写字母的行后停止捕获

2024-10-01 22:37:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图只捕捉标题之间始终都是大写的单词(在下面的示例中,“SONG”和“AT BAIA”)。当使用这个时,我将知道第一个标题是什么(即“歌曲”),但我不知道第二个标题是什么(即“在BAIA”)

范例

And I lie listening awake?    
SONG    
You are as gold    
The half-opened flowers    
For your face is as fair as rain,    
Yet as rain that lies clear    
Casts light for a shadow.    
AT BAIA    
I should have thought

我成功地用以下方法捕捉到了“歌曲”下面的所有内容:

SONG\s*((.*\s.*)*)

但是当我到达一条只有大写字母的线时,我想不出如何停止

任何帮助都将不胜感激


Tags: and标题示例songas歌曲单词at
3条回答

您可以使用以下选项:

SONG[\s\S]*(?=^[A-Z][A-Z ]+$)

Demo

您还需要re.MULTILINE标志才能正常工作

您可以匹配歌曲,然后在组中捕获所有不以2个大写字符开头的行

^SONG\b.*((?:\r?\n(?![A-Z]{2}).*)*)

Regex demo

或者,如果行只能包含大写字母,并且也应以一个开头:

^SONG\b.*((?:\r?\n(?![A-Z][A-Z ]*$).*)*)
  • ^字符串的开头
  • SONG\b.*匹配歌曲、单词边界和行的其余部分
  • (捕获组1
    • (?:非捕获组
      • \r?\n(?![A-Z][A-Z ]*$).*如果新行不只包含大写字符,则将其与该行的其余部分匹配
    • )*关闭组并匹配所有行
  • )关闭组1

Regex demoPython demo

我建议使用更简单的正则表达式SONG(?:.|\n)*[A-Z]{3,}\s+\n

  • SONG开始
  • 阅读任何内容
  • 当行以大写字母结尾时停止(至少3个大写字母,您可以选择所需的大小)

^{}

相关问题 更多 >

    热门问题