我写了一个正则表达式来匹配子字符串和它周围的空格,但是效果不好

时间:2019-10-19 17:59:59

标签: regex python-3.x regex-lookarounds substitution

实际上,我正在处理一个正则表达式问题,其任务是获取一个子字符串(||,&&),并用另一个子字符串(或,和)替换它,我为此编写了代码,但效果不佳

question = x&& &&& && && x || | ||\|| x
Expected output = x&& &&& and and x or | ||\|| x

这是我写的代码

import re
for i in range(int(input())):
    print(re.sub(r'\s[&]{2}\s', ' and ', re.sub(r"\s[\|]{2}\s", " or ", input())))

我的输出= x && &&&&和&& x或| || \ || x

3 个答案:

答案 0 :(得分:4)

您需要使用环视功能,当前正则表达式的问题是criteriaQuery = criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("insurer").get("id"), id)); ,此处&& &&的第一个匹配项捕获了空间,因此在第二个&&之前没有可用空间,因此赢了不匹配,因此我们需要使用&&

替换正则表达式

zero-length-match ( lookarounds)

\s[&]{2}\s --> (?<=\s)[&]{2}(?=\s) \s[\|]{2}\s --> (?<=\s)[\|]{2}(?=\s) -匹配项应位于空格字符之前

(?<=\s)-匹配项后应带有空格字符

答案 1 :(得分:0)

您正在寻找像(?<=\s)&&(?=\s) (Regex demo)

这样的正则表达式

使用环视方法来断言目标替换组周围的空格字符的位置会导致出现重叠的匹配-否则,它将匹配两侧的空格并屏蔽其他选项。

import re

in_str = 'x&& &&& && && x || | ||\|| x'
expect_str = 'x&& &&& and and x or | ||\|| x'

print(re.sub("(?<=\s)\|\|(?=\s)", "or", re.sub("(?<=\s)&&(?=\s)", "and", in_str)))

Python demo

答案 2 :(得分:0)

尝试使用re.findall()代替re.sub