我需要解析一行文本并将其分成几部分,然后将其添加到列表中,这是我借助re.parse('regexp')能够做到的。问题是我得到了一些我不希望与此匹配的文本,但是我需要知道它在哪里,如何检测它,当然还有它是什么,以显示错误。
代码完全匹配并过滤掉了,我需要过滤掉与正则表达式不匹配的12和32
import re str = '12 32 455c 2v 12tv v 0.5b -3b -b+b-3li b-0.5b 3 c -3 ltr' a=re.compile(r'[+-]?[0-9]*\.[0-9]+\s*[a-z]+|[+-]?[0-9]*\s*[a-z]+') r=a.findall(str) print (r)
初始字符串:
str= '12 32 455c 2v 12tv v 0.5b -3b -b+b-3li b-0.5b 1 3 c -3 ltr' list parsed, correctly ['455c', '2v', '12tv', ' v', '0.5b', '-3b', '-b', '+b', '-3li', ' b', '-0.5b', '3 c', '-3 ltr'] list that i need as well and any other string not matched ie: (/%&$%) [12, 32, 1]
答案 0 :(得分:0)
我的猜测是,如果我们不想只收集数字,那么我们将从一个简单的表达式开始:
\b([\d]{1,}\s)\b|([\w+-.]+)
有两个部分:
\b([\d]{1,}\s)\b
是我们不需要的数字,并且
([\w+-.]+)
有我们想要的输出。
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"\b([\d]{1,}\s)\b|([\w+-.]+)"
test_str = "12 32 455c 2v 12tv v 0.5b -3b -b+b-3li b-0.5b 3 c -3 ltr"
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。
jex.im可视化正则表达式:
答案 1 :(得分:0)
我自己解决了此问题,方法是替换正确解析的初始字符串,因此我得到了区别,然后拆分以将其作为列表获取
str = '12 32 455c 2v 12tv v 0.5b -3b -b+b-3li b-0.5b 1 3 c -3 ltr'
a=re.compile(r'[+-]?[0-9]*\.[0-9]+\s*[a-z]+|[+-]?[0-9]*\s*[a-z]+')
r=a.findall(str)
print (r)
errors = str
for t in r:
errors = errors.replace(t, '', 1)
errors = errors.split()
print(errors)