我正在使用正则表达式从python中的文本中提取首字母缩写词(仅特定类型)。
到目前为止,我正在使用
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
答案 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.findall
和B&WW
,因为我们并非每次都强制使用(相同)字符。如果需要的话,表达式会变得复杂一些(尽管不多)。
答案 1 :(得分:2)
我建议
\b[A-Z](?=([&.]?))(?:\1[A-Z])+\b
请参见regex demo
模式详细信息
\b
-单词边界[A-Z]
-大写字母(?=([&.]?))
-一个正向超前行为,其中包含一个捕获组,该捕获组将一个可选的&
或.
字符(?:\1[A-Z])+
-一次或多次出现
\1
-将相同的字符捕获到第1组中(因此,您将不会获得A.T&W
)[A-Z]
-大写字母\b
-单词边界。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']