正则表达式以提取首字母缩写词

时间:2018-11-05 06:30:53

标签: regex python-3.x

我正在使用正则表达式从python中的文本中提取首字母缩写词(仅特定类型)。

  • ABC(圆括号或方括号内或词尾之间的所有大写字母)
  • A.B.C(与上面相同,但中间只有一个'。')
  • A&B&C(与上述相同,但中间只有一个'&')

到目前为止,我正在使用

text = "My name is STEVE. My friend works at (I.A.). Indian Army(IA). B&W also B&&W Also I...A"
re.findall('\\b[A-Z][A-Z.&]{2,7}\\b', text)

Output is : ['STEVE', 'I.A', 'B&W', 'B&&W', 'I...A']
I want to exclude B&&W and I..A, but include (IA). 

我知道以下链接,但我无法正确使用它们。请帮助。

Extract acronyms patterns from string using regex

Finding Acronyms Using Regex In Python

RegEx to match acronyms

2 个答案:

答案 0 :(得分:3)

您想要的是一个大写字母,后跟一堆大写字母,中间带有可选的点或“&”号。

$data = $notification->data; // Array fetched from database
$model = Admin::hydrate([$data])[0];
$model->setAttribute('prefers_email', true);

Notification::send($shopadmin, new ShopadminCreated($model));

打破现状:

  • 所有反斜杠都会加倍,因为它们需要转义
  • re.findall('\\b[A-Z](?:[\\.&]?[A-Z]){1,7}\\b', text) 单词边框
  • \b资本
  • [A-Z]打开一个非捕获组
  • (?:字符类,其中包含[\.&].
  • &可选
  • ?后跟另一个大写字母
  • [A-Z]关闭非捕获组的可选).,后跟大写字母
  • &重复该组1至7次
  • {1,7}单词边框

我们想要一个非捕获组,因为\b返回了组(如果存在)。

有更好的匹配所有Unicode字符的大写字母的方法。

匹配 re.findallB&WW,因为我们并非每次都强制使用(相同)字符。如果需要的话,表达式会变得复杂一些(尽管不多)。

答案 1 :(得分:2)

我建议

\b[A-Z](?=([&.]?))(?:\1[A-Z])+\b

请参见regex demo

模式详细信息

  • \b-单词边界
  • [A-Z]-大写字母
  • (?=([&.]?))-一个正向超前行为,其中包含一个捕获组,该捕获组将一个可选的&.字符
  • 捕获到组1中
  • (?:\1[A-Z])+-一次或多次出现
    • \1-将相同的字符捕获到第1组中(因此,您将不会获得A.T&W
    • [A-Z]-大写字母
  • \b-单词边界。

Python demo

import re
rx = r"\b[A-Z](?=([&.]?))(?:\1[A-Z])+\b"
s = "My name is STEVE. My friend works at (I.A.). Indian Army(IA). B&W also B&&W Also I...A"
print( [x.group() for x in re.finditer(rx, s)] )
# => ['STEVE', 'I.A', 'IA', 'B&W']