首页 > 解决方案 > 如何说正则表达式忽略我需要删除的分隔符

问题描述

我学会了如何使用字符串,我有一个像这样的字符串:

"one; two\t; "three;2"; four;\t\t" 

如果这个字符串有“”,那么我需要忽略这个“”中的分隔符

我想得到:

one two three;2 four

我怎样才能做到这一点?

标签: regex

解决方案


更新 我已将这两种表达式方法合并到以下 RegEx 中,该方法应该在不同的 RegEx 编译器中工作,这些编译器支持包含任意长度的表达式的外观。

这是表达式:

(?:(?<=\")[^\"]+(?=\"[\t]*;)|\w+)+

使用以下输入进行测试:

s='"zero,;6"\t\t; one; two\t\t; "three,;2"; four;\t\t; "five;six"\t; "seven";'

然后在 python 中运行(re 模块的导入未显示):

re.findall(r'(?:(?<=\")[^\"]+(?=\"[\t]*;)|\w+)+', s)

注意:您也可以指定[\t\v\r\n\f]*文件[\t]*是否包含这些额外的特殊字符。)

产生以下列表:

['zero,;6', 'one', 'two', 'three,;2', 'four', 'five;six', 'seven']

忽略 在双引号子字符串中出现的分隔符的一种方法是使用环视。

例如,要匹配双引号子字符串,但在结果匹配的子字符串中不包含引号,可以按以下方式使用正向前瞻和后视的组合:

(?<=\")([^\"]+)(?=\";)

The(?<=\")是前面双引号(?=\";)存在的断言,而 the 是尾随双引号或分号分隔符存在的断言。捕获组([^\"]+)匹配任何字符序列,但双引号除外,以避免在这些引号内重复注册引号。如果上述断言成立,那么我们就有一个匹配的子字符串。

对于普通元素,我们可以匹配一个仅包含字母数字字符的序列,如下所示:

\w+

现在通过使用我们拥有的非捕获组将这两者结合起来:

(?:(?<=\")([^\"]+)(?=\";)|(\w+))+

注意:此方法的一个强制性步骤是首先丢弃任何出现的制表符。如果您在 Python 中,这可以使用str' 方法replace或使用re模块来完成,sub如下所示:

re.sub(r'[\t\v\r\n\f]', r'', string)

(我还包括其他特殊字符,但如果对您的用例安全,您可以省略它们)

然后,您可以使用其中一个searchfindallre模块中使用,给出上面的 RegEx。

如果您选择,findall那么您应该使用上面的表达式而不进行任何组捕获:

re.findall(r'(?:(?<=\")[^\"]+(?=\";)|\w+)+', string)

例子

对于以下输入字符串:

string = '"ty,;6"\t\t; one; two\t\t; "three,;2";  four;\t\t; "fdf;fdfgf"\t; "fdfdf";'

运行替换步骤,结果是:

> str_clean = re.sub(r'[\t\v\r\n\f]', r'', string)
 '"ty,;6"; one; two; "three,;2";  four;; "fdf;fdfgf"; "fdfdf";'

然后,运行最终的 RegEx:

> re.findall(r'(?:(?<=\")[^\"]+(?=\";)|\w+)+', str_clean)
 ['ty,;6', 'one', 'two', 'three,;2', 'four', 'fdf;fdfgf', 'fdfdf']

推荐阅读