有两种方法。两者都是超级笨拙的,并且非常依赖于原始字符串的非常小的波动。但是,您可以修改代码以提供更多的灵活性。
这两个选项都取决于满足这些特征的线路...
有问题的分组必须...
- 以字母或斜线开头,可能大写
- 感兴趣的标题后跟一个冒号(“:”)
- 仅获取冒号后的第一个单词。
方法一,正则表达式,这个只能抓取两块数据。第二组是“其他所有内容”,因为我无法正确重复搜索模式:P
代码:
import re
l = [ 'MC/MX/FF Number(s): None DUNS Number: -- ', 'Power Units: 1 Drivers: 1 ' ]
pattern = ''.join([
"(", # Start capturing group
"\s*[A-Z/]", # Any number of space, until and including only the first capital or forward slash
".+?\:", # any character (non-greedy) up to and including the colon
"\s*", # One or more spaces
"\w+\s*", # One or more alphanumeric chars i.e. [a-zA-Z0-9]
")", # End capturing group
"(.*)"
])
for s in l:
m = re.search(pattern, s)
print("----------------")
try:
print(m.group(1))
print(m.group(2))
print(m.group(3))
except Exception as e:
pass
输出:
----------------
MC/MX/FF Number(s): None
DUNS Number: --
----------------
Power Units: 1
Drivers: 1
方法二,逐字解析字符串。该方法与正则表达式基本特征相同,但可以做两个以上感兴趣的块。它的工作原理...
- 开始逐字解析每个字符串,并将其加载到
newstring。
- 当遇到冒号时,标记一个标志。
- 将下一个循环中的第一个单词添加到
newstring。如果需要,您可以将其更改为 1-2、1-3 或 1-n 字。您也可以让它在设置colonflag 之后继续添加单词,直到满足某些条件,例如带有大写字母的单词……尽管这可能会中断诸如“无”之类的单词。你可以一直到遇到一个全大写的单词,但是一个非全大写的标题会破坏它。
- 将
newstring 添加到newlist,重置标志,并继续解析单词。
代码:
s = 'MC/MX/FF Number(s): None DUNS Number: -- '
for s in l:
newlist = []
newstring = ""
colonflag = False
for w in s.split():
newstring += " " + w
if colonflag:
newlist.append(newstring)
newstring = ""
colonflag = False
if ":" in w:
colonflag = True
print(newlist)
输出:
[' MC/MX/FF Number(s): None', ' DUNS Number: --']
[' Power Units: 1', ' Drivers: 1']
第三个选项:
创建所有预期标头的列表,例如header_list = ["Operating Status:", "Out of Service Date:", "MC/MX/FF Number(s):", "DUNS Number:", "Power Units:", "Drivers:", ]
,并根据这些标头进行拆分/解析。
第四个选项
使用Natural Language Processing 和机器学习来实际找出逻辑句子的位置;)