Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式将单词与第一个大写字母匹配_Python_Regex - Fatal编程技术网

Python 正则表达式将单词与第一个大写字母匹配

Python 正则表达式将单词与第一个大写字母匹配,python,regex,Python,Regex,尝试使用正则表达式识别文本数据的结构并遇到障碍 对于下面的示例文本 我是一个标题: Lorem Ipsum只是印刷的虚拟文本 以及排版业。Lorem Ipsum一直是该行业的佼佼者 16世纪以来的标准虚拟文本 我是一个标签-Lorem Ipsum只是印刷的虚拟文本 我下面的正则表达式选择“我是一个标题”和“我是一个标签-” ^\s*(?:\b[A-Z]+\b[\s]*)+(?:[:-])\s*$ 请建议编辑以匹配“我是标题”和“我是标签”以及 忽略结束标记“:”和“-”。您可以使用 ^\s*(

尝试使用正则表达式识别文本数据的结构并遇到障碍

对于下面的示例文本

我是一个标题:
Lorem Ipsum只是印刷的虚拟文本 以及排版业。Lorem Ipsum一直是该行业的佼佼者 16世纪以来的标准虚拟文本

我是一个标签-Lorem Ipsum只是印刷的虚拟文本

我下面的正则表达式选择“我是一个标题”和“我是一个标签-”

^\s*(?:\b[A-Z]+\b[\s]*)+(?:[:-])\s*$
请建议编辑以匹配“我是标题”和“我是标签”以及 忽略结束标记“:”和“-”。

您可以使用

^\s*(?:\b[a-zA-Z]+\b\s*)+(?=[:-])

正则表达式细分:

  • ^
    -字符串的开头
  • \s*
    -0或更多空格
  • (?:\b[a-zA-Z]+\b\s*)+
    -1个或多个
    • \b
      -字边界(冗余)
    • [a-zA-Z]+
      -1个或多个字母
    • \b\s*
      -0或更多空白
  • (?=[:-])
    -一种前瞻,要求
    -
    紧跟在前面的子模式之后

这里的要点是将
[a-z]
添加到
[a-z]
范围,删除
\s*$
,并将
(?:…)
非捕获组转到前瞻组(不使用字符)。

这是@stribizev的解决方案,效果非常好

^\s*(?:\b[a-zA-Z]+\b\s*)+(?=[:-])
对于像我这样的新手,这是对解决方案的简单解释:

> ^\s      Anchor to the white space (tab, newline, blankspace)
> *        Look for repetition of white space if any 
> (?:      Start a non-capturing group 
> \b       Look for a word 
> [a-zA-Z] Anyword that starts with either a capital or small alphabet
> +        Look for repeating capital/small alphabets
> \s*      Match a blank space after the word 
> )+       Repeat 
> (?=      Ignore what follows (my best guess) 
> [:-]     Look for ':' or '-'
本质上,这个正则表达式在后跟“:”或“-”的换行中查找一组单词

通过添加{n,m}as,告诉上面的表达式超出您开始丢失相关信息的单词数,从而使上面的表达式更智能

^[\s]*(?:\b[a-zA-Z]+\b[\s]*){1,3}(?=[:-])

为什么要使用正则表达式<代码>用于行中的myword。拆分():如果myword[0]==myword[0]。upper()和myword[0]。isalpha():#做点什么我可以限制可以出现在结束标记之前的字数吗?说1到4个单词。怎么做?不用担心。知道了。谢谢。是的,我想用
{n}
替换
+
,其中
n
是数字
{2}
是一个限制量词,正好匹配前面的子模式2次。我认为您不需要在
{1,3}
之后使用
+
,因为量词已经贪婪了。Python不支持所有格量词。@斯特里比雪夫:谢谢。编辑了答案。