regex 正则表达式识别和提取结构化信息

ijnw1ujt  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在解析一个包含结构化信息的非结构化文本文件。编写正则表达式来识别和提取结构化字符串是很简单的。似乎也应该有一种直接的方法来使用正则表达式从字符串中提取信息的 * 单个组件 *。
下面是我正在做的一个简单的例子:
信息结构:

Integer1 - Phrase1 (Phrase2) (Integer2)

我能够建立一个正则表达式来标识该结构。这似乎是有效的(即使它不是最佳正则表达式模式):

import re

white='\s' # whitespace
integer='\d+'
paren_integer = '\(' + integer + '\)' # integer contained within parentheses
phrase = '.+' # one or more words
paren_phrase = '\(.+\)' # one or more words contained within parentheses
dash = '-'

exp = re.compile(integer + white + dash + white+ phrase + white + paren_phrase + white + paren_integer)
structured_string = exp.match(string_to_search)

print(structured_string)
# 'Integer1 - Phrase1 (Phrase2) (Integer2)'

一旦我确定了结构化字符串,我当然可以编写一些代码来解析和提取结构化字符串中的信息,但似乎应该有一种更简单的方法来使用正则表达式的组件,也许通过在列表中传递正则表达式组件而不是连接的正则表达式字符串。类似于以下内容:

regex_components = [integer, white, dash, white, phrase, white, paren_phrase, white, paren_integer]
exp = re.compile(regex_components)
data_components = exp.match(string_to_search)

print(data_components)
# [Integer1, ' ', '-', ' ', Phrase1, ' ', (Phrase2), ' ', (Integer2)]

这可能吗?有没有更聪明的方法来做到这一点?

laawzig2

laawzig21#

你可以很容易地匹配组(()),如下所示:

import re
compiled_re = re.compile(r"(\d+) - ([^(]+) \(([^)]+)\) (\d+)")
result = compiled_re.findall("1234 - Lesson 1 (date 1/1/2018) 5678")
print(result)  # [('1234', 'Lesson 1', 'date 1/1/2018', '5678')]

我还提高了正则表达式的效率,以防止指数回溯。

相关问题