regex - 如何说正则表达式忽略我需要删除的分隔符
问题描述
我学会了如何使用字符串,我有一个像这样的字符串:
"one; two\t; "three;2"; four;\t\t"
如果这个字符串有“”,那么我需要忽略这个“”中的分隔符
我想得到:
one two three;2 four
我怎样才能做到这一点?
解决方案
更新 我已将这两种表达式方法合并到以下 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)
(我还包括其他特殊字符,但如果对您的用例安全,您可以省略它们)
然后,您可以使用其中一个search
或findall
从re
模块中使用,给出上面的 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']
推荐阅读
- android - 将 google 脚本中的文本设置为 edittext
- apache-spark - 如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?
- javascript - 从 API 获取数据后打印变量为空,然后打印填充的值
- angular - 无法解析所有参数+错误+服务单元测试
- javascript - 反应功能和类组件是否呈现不同?
- angular - 如何根据角度的api响应刷新表格
- css - 如何使用 CSS 绘制在 Bootstrap Carousel 指示器中移动的内圈?
- powerbi - CALCULATE 中的 FILTER 是否添加或修改过滤器上下文?
- terraform - 用于依赖 argumnets 的单个 terraform 模块
- python - Pythod xlrd 细胞类型