Python 如何使用负前瞻删除两个字符之间的搜索

Python 如何使用负前瞻删除两个字符之间的搜索,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,输出 string1 = '%(example_1).40s-a%(example-2)s_-%(example3)s_s1' 需要删除“%”和“s”之间的所有选择 尝试1: '-a', '_-', '_s1' 结果: re.findall("[-_a-z0-9]+(?![^%]*\s)", string1) re.findall("[-_a-z0-9]+(?![^(]*\))", string1) import re result = [x for x in re.split("%.

输出

string1 = '%(example_1).40s-a%(example-2)s_-%(example3)s_s1'
需要删除“%”和“s”之间的所有选择

尝试1:

'-a', '_-', '_s1'
结果:

re.findall("[-_a-z0-9]+(?![^%]*\s)", string1)
re.findall("[-_a-z0-9]+(?![^(]*\))", string1)
import re

result = [x for x in re.split("%.*?s",'%(example_1).40s-a%(example-2)s_-%(example3)s_s1') if x]

print(result)
尝试2:

['example_1', '0s-a', 'example-', 's_-', 'example', 's_s1']
结果:

re.findall("[-_a-z0-9]+(?![^%]*\s)", string1)
re.findall("[-_a-z0-9]+(?![^(]*\))", string1)
import re

result = [x for x in re.split("%.*?s",'%(example_1).40s-a%(example-2)s_-%(example3)s_s1') if x]

print(result)
尝试2接近预期匹配的40秒,介于%&s之间。在其他条目中超过了“s”

预期产量

['40s-a', 's_-', 's_s1']
编辑:

要确认如何不在%&s之间搜索

['-a', '_-', '_s1']
预期产出: ['abc123'、'-a'、'-U-'、'-U s1'

string2 = 'abc123%(example_1).40s-a%(example-2)s_-%(example3)s_s1'
预期产出:
['abc123'、'-a'、'.-']

您可以使用正则表达式来完成

%[^s]*s([^%]+)

匹配项存储在组中

string3 = 'abc123%(example_1).40s-a%(example-2)s_-%(examples3).40s'
或者如果你想让它们在一个数组中

import re

regex = r"%[^s]*s([^%]+)"

test_str = "%(example_1).40s-a%(example-2)s_-%(example3)s_s1"

subst = "\\1,"

result = re.sub(regex, subst, test_str, 0)

if result:
    print (result)
选中您可以使用的:

import re

regex = r"%[^s]*s([^%]+)"

test_str = "%(example_1).40s-a%(example-2)s_-%(example3)s_s1"

subst = "\\1,"

result = re.findall(regex,test_str);

if result:
    print (result)
在这里:

  • %[^s]*s
    :匹配
    %
    s
    字符之间的所有内容
  • sub
    函数用
  • 拆分
    函数在
    上拆分:
我宁愿使用“负”方法,使用
re.split
使用非贪婪匹配来匹配
%
s
之间的字符:此时正则表达式非常简单

仅kludge:您需要筛选空字段(字符串的开头)

结果:

re.findall("[-_a-z0-9]+(?![^%]*\s)", string1)
re.findall("[-_a-z0-9]+(?![^(]*\))", string1)
import re

result = [x for x in re.split("%.*?s",'%(example_1).40s-a%(example-2)s_-%(example3)s_s1') if x]

print(result)
编辑:该简单表达式不起作用。如果括号中包含“s”字符,则可以用更复杂的表达式替换该表达式:

['-a', '_-', '_s1']

(这是一个需要括号的表达式或前面的简单表达式:即使没有括号也允许匹配)

基于这些测试字符串:

%\(.*?\).*?s|%.*?s
你可以做:

tests=('%(example_1).40s-a%(example-2)s_-%(example3)s_s1', 
       'abc123%(example_1).40s-a%(example-2)s_-%(example3)s_s1')
结果:

for s in tests:
    print re.findall(r'(?:s|^)([^%\n]+)(?=%|$)', s)

在所有这些之后,你能给我们看一下预期的输出吗?预期的输出['-a'、''''.-'、''.''.\U s1']你能解释一下正则表达式在做什么吗。我对第一部分有点理解,但对第二部分失去了理解。s([^%]+)[^%]匹配任何不是“%”的东西,所以([^%]+)匹配所有的东西都是“%”发生,请签出,绿色表示捕获的组是在“s”和任何非“%”字符之间搜索的正则表达式?如果字符串1='abc123%(示例_1).40s-a%(示例-2)s'@user1539348:是,您对
'abc123%(示例_1).40s-a%(示例-2)的预期输出是什么s'
?也许您应该添加几个示例输入和所需输出。我添加了额外的大小写。预期结果将是['abc123'、'-a'、'-u-'、'-u-s1'。我又添加了一个似乎正在中断的测试用例。它如何匹配前面的字符。例如'string2='abc123%(示例_1)。40s-a%(示例-2)s-%(示例3)你会用这样的“([^%]+)%[^s]*s”吗?|添加到描述中的详细输出这几乎可以工作,除非字符串=”(示例1)。40s-a%(示例2)s_-%(示例3)s),它还捕获我用你的输入测试过的最后一个字符['example3)s',我得到了
['-a',''-u']
这是预期的。为我添加的所有无关情况道歉。似乎在测试时,我没有达到预期的结果是因为示例字符串与此字符串类似4='%(示例_1)。40s-a%(示例-2)s_-%(示例3)这是一个很小的例子。在最后的决赛中,这会导致一个例句的切分。SMEI的答案似乎甚至涵盖了你后来添加的案例。考虑接受最适合你的需要的答案(除了Upple投票)<代码>(PDB)StRIG4= '%(ExpRePy1).40s A%(Excel -2)Sy-%(ExpReS3)。
['-a'、'-u-'、'3).40s']
只有
['-a'、'-u-']
应该匹配