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-']
应该匹配