Python regex';忽略的特殊字符串填充字符;s
我正在解析文本,其中包括过滤掉特殊字符或空白,以便正确分类字符串。问题是原始字符串的索引映射回其他元数据(图像中OCRd文本的x、y坐标)。一旦关键字被正确分类,我想通过索引(开始和结束)映射回原始的预处理字符串,而不是关键字本身。位置比关键字更重要,因为关键字不一定是唯一的 许多代码如下所示:Python regex';忽略的特殊字符串填充字符;s,python,regex,unicode,nlp,text-processing,Python,Regex,Unicode,Nlp,Text Processing,我正在解析文本,其中包括过滤掉特殊字符或空白,以便正确分类字符串。问题是原始字符串的索引映射回其他元数据(图像中OCRd文本的x、y坐标)。一旦关键字被正确分类,我想通过索引(开始和结束)映射回原始的预处理字符串,而不是关键字本身。位置比关键字更重要,因为关键字不一定是唯一的 许多代码如下所示: filtered_text=re.sub(\s{5,},,,行) mobj=re.match(我的个人资料、过滤的文字) 返回(移动开始(0)、移动结束(0)) 我想知道是否可以用一个特殊的“paddi
filtered_text=re.sub(\s{5,},,,行)
mobj=re.match(我的个人资料、过滤的文字)
返回(移动开始(0)、移动结束(0))
我想知道是否可以用一个特殊的“padding/filler”字符代替空字符串?这一特殊性质将满足两个要求:
(1) 它占用空间,因此:
len(line) == len(filtered_line)
(2) 它被下游模式正则表达式匹配项忽略
我是否可以使用任何特殊的unicode字符,或者可以将re模块中的某些内容设置为忽略特定字符
此外,我不能将替换模式与匹配模式合并,因为代码的不同部分是相互抽象的。上面的示例非常简单——代码的实际两个独立部分非常复杂。在替换空白时,需要保留从变换位置到原始位置的映射
def sub_with_mapping(pattern, repl, string):
mapping = dict()
source_index = [0]
target_index = [0]
target = []
#
def append_segment(original_len, text, keep_positions):
for i in range(0, len(text)):
mapping[target_index[0] + i] = source_index[0] + (i if keep_positions else 0)
target.append(text)
target_index[0] += len(text)
source_index[0] += original_len
#
for match in re.finditer(pattern, string):
# Append text between previous and this match
prefix = string[source_index[0]:match.start()]
append_segment(len(prefix), prefix, True)
# Append replacement text
replacement = repl
if callable(replacement):
replacement = replacement(match)
append_segment(len(match.group(0)), replacement, False)
# Append text after last match
suffix = string[source_index[0]:]
append_segment(len(suffix), suffix, True)
return ''.join(target), mapping
然后可以对返回的字符串进行匹配,并将索引映射回原始字符串
请注意,如果替换长度超过一个字符,则会将多个索引映射回同一原始索引
如果字符串非常长(>1MB?),则可能需要优化数据结构。也许您可以使用范围?您可以使用
\0
,它可能不会显示在任何地方。这是什么格式的?这是utf-8。以下是我正在尝试的:t='这是一个\0string'mobj=re.search('(.*astring'),t)
我尝试了很多排列,但搜索仍然失败。有什么想法吗?我指的是你试图解析的格式的名称。它是由Tesseracts生成的吗?
>>> sub_with_mapping(r'\w+', 'x', 'foo --- bar --- baz')
('x --- x --- x', {0: 0, 1: 3, 2: 4, 3: 5, 4: 6, 5: 7, 6: 8, 7: 11, 8: 12, 9: 13, 10: 14, 11: 15, 12: 16})