我想获取所有至少1个单词的仅字母“链”,以大写字母开头,然后是小写字母,并用空格(“”)或“-”连接(“链”不能与“- “ 与 ” ”)
例如,对于以下文本:
对于第一阶段,应按开始,然后按照步骤一和步骤三进行操作。对于最后阶段,您必须遵循一,二,五,七步骤的顺序
我的输出应该是
[“对于”,“第一阶段”,“开始”,“第一步”,“第三步”,“最后阶段”,“一二五十七”,“步骤”]
到目前为止,我尝试编写2种不同的正则表达式来解决我的问题。第一个字符串应返回与“-”连接的“ chains”,第二个字符串应返回与“”连接的“ chains”:
import re
list(set(re.findall('([A-Z][a-z]+-)*[A-Z][a-z]+', mystring) + re.findall('([A-Z][a-z]+ )*[A-Z][a-z]+', mystring)))
但是,我猜他们错了,因为他们俩都无法正常工作。
您可以使用
\b[A-Z][a-z]+(?=([-\s]?))(?:\1[A-Z][a-z]+)*\b(?!-[A-Z])
请参阅regex演示。详细资料:
\b
-字边界[A-Z][a-z]+
-大写ASCII字母,后跟一个或多个小写ASCII字母(?=([-\s]?))
-正向超前查询,需要-
立即在当前位置的右侧添加a或空白字符(1或0次,可选),将字符捕获到第1组中(?:\1[A-Z][a-z]+)*
-零次或多次重复
\1
-与第1组中捕获的文本相同[A-Z][a-z]+
-大写ASCII字母,后跟一个或多个小写ASCII字母\b(?!-[A-Z])
-不紧随其后的单词边界-
和大写ASCII字母。参见Python演示:
import re
pattern = r"\b[A-Z][a-z]+(?=([-\s]?))(?:\1[A-Z][a-z]+)*\b(?!-[A-Z])"
text = "For the First Stage, you should press Start and you should follow Step-One and Step-Three. For the Final Stage, you must follow the sequence of steps One-Two-Five Seven // Steps One-Two-Five-Seven"
print( list(set([x.group() for x in re.finditer(pattern, text)])) )
# => ['Step-Three', 'For', 'First Stage', 'Seven', 'One-Two-Five-Seven', 'Start', 'One-Two-Five', 'Steps', 'Step-One', 'Final Stage']
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句