我想将一个字符串拆分为一个单词列表(这里“word”表示非空格字符的任意序列),但也要保留用作分隔符的连续空格组(因为空格的数量在我的数据中很重要)。对于这个简单的任务,我知道下面的regex可以完成这项工作(我使用Python作为说明性语言,但是代码可以很容易地适应任何语言,包括regex):
import re
regexA = re.compile(r"(\S+)")
print(regexA.split("aa b+b cc dd! :ee "))
生成预期输出:
['', 'aa', ' ', 'b+b', ' ', 'cc', ' ', 'dd!', ' ', ':ee', ' ']
现在最困难的部分是:当一个单词包含一个左括号时,在匹配的右括号之前遇到的所有空格都不应被视为单词分隔符。换句话说:
regexB.split("aa b+b cc(dd! :ee (ff gg) hh) ii ")
应产生:
['', 'aa', ' ', 'b+b', ' ', 'cc(dd! :ee (ff gg) hh)', ' ', 'ii', ' ']
使用
regexB = re.compile(r'([^(\s]*\([^)]*\)|\S+)')
适用于一对圆括号,但在有内圆括号时失败。如何改进正则表达式以正确跳过内圆括号?你知道吗
最后一个问题:在我的数据中,只有以%
开头的单词应该被测试“括号规则”(regexB
),其他单词应该被regexA
处理。我不知道如何在一次拆分中合并两个正则表达式。你知道吗
欢迎任何提示。。。你知道吗
最后,基于@Wiktor Stribiżew和@Thm Lee提出的答案,在测试了几个想法之后,我找到了一堆处理不同复杂程度的解决方案。为了减少依赖性,我想继续使用Python标准库中的
re
模块,下面是代码:以下是生成的输出:
如OP中所述,对于我的特定数据,括号中的转义空格只能用于以
%
开头的单词,其他括号(例如我的示例中的单词b%b(
)不被认为是特殊的。如果要转义任何一对括号中的空格,只需删除regex中的%
字符。以下是修改后的结果:在
PCRE regex
引擎中,支持sub-routine
,并且recursive pattern
对于包含balanced nested
括号的情况似乎是可行的。你知道吗Demo,,,其中
(?1
)表示调用子程序1,(\([^()]*(?1)?[^()]*\))
,即recursive pattern
,其中包括caller
,(?1)
但是python不支持
regex
中的sub-routine
模式。你知道吗因此,我首先尝试用另一个不同的字符(
@
替换每个(
,)
),然后应用正则表达式进行拆分,最后在pythone脚本中分别将@
转换回(
或)
。你知道吗用于拆分的正则表达式。你知道吗
Demo,,,其中我将分隔符
\S+
更改为连续空格\s+
,因为@
、(
、)
包含在[\S]
'possible characters set
中。你知道吗Python脚本可能是这样的
输出为
相关问题 更多 >
编程相关推荐