我希望我能够清楚地解释清楚。首先,我是一个正则表达式的菜鸟,所以请原谅我的无知。现在,我正在建立一个系统来检测一个8位数字,从一个或两个零开始,和/或一个预定义的单词列表。我需要检测数字是否随之找到,或者甚至连接到数字。但是,我不希望它检测到数字,如果它包含全部零,无论是否找到它,或者附加到列表中的单词。我也不想检测任何其他字符开头或结尾的数字,如破折号或斜线。这可能是不可能的,但我想我还是会问。我目前正在使用这个公式,意识到它只找到数字:\ b(?!0 + $)\ d {8} \ b
以下是我要做的细分:
检测: 01234567 wordfromlist或wordfromlist 012345678 OR wordfromlist01234567 OR 01234567wordfromlist
请勿检测: 00000000 wordfromlist或 wordfromlist 0000000或00000000wordfromlist或wordfromlist00000000或
请勿检测: 01234567-或-01234567或/ 01234567 /等
我希望我能够正确解释这一点。如果没有,我会再试一次。提前感谢您的时间和帮助。
答案 0 :(得分:1)
(?<=[a-zA-Z]|\s|^)\d*[1-9]+\d*(?=[a-zA-Z]|\s|$)
让我分解一下来解释......
1. (?:^|(?<=[a-zA-Z\s]))
正向后视(?<=
,仅匹配no.s,前面有空格或字母。或者开始行。同时在非捕获组(?:
中
2. \d*
号码应以[0-9]
的零或多位开头
3. [1-9]+
号码应该在[1-9]
中至少有一位数字
4. \d*
后跟[0-9]
中的零或多位数字
5. (?:(?=[a-zA-Z\s])|$)
正向前瞻(?=
,仅匹配no.s后跟空格或字母。或者行结束。请在非捕获组(?:
请注意,由于您的某个序列长度为9 012345678
如果您想要8位数的约束,请使用this ..
(?:^|(?<=[a-zA-Z\s]))0(?!0{7})\d{7}(?:(?=[a-zA-Z\s])|$)
0
从零开始(?!0{7})
否定前瞻(?!
不要使用七个零跟随第一个零\d{7}
与七位数的任意数字匹配(当然 2 满足后)编辑为正则表达式使用python风格,对不起我忽略的错误&amp;用pcre代替python。 Regex For Python here
答案 1 :(得分:0)
你可以试试这个:
import re
tests = ["01234567", "00000000", "01234567-"]
final = [i for i in tests if re.findall("(^0{1,2})[1-9]{6,7}\d$", i)]
输出:
['01234567']
答案 2 :(得分:0)
我不太相信你可以在一个正则表达式中做你想做的一切。 最好从标识出现8个数字(有或没有预定义列表中的单词)开始,然后将其交给下一个处理阶段。
这样的东西会返回一个'匹配'对象列表,然后可以进一步查询:
import re
strings_to_test = ['01234567' , '00000000', 'special-word 01234567'
'special-word01234567', 'special-word01234567-']
digits_present = [re.search("(\S*) *([0-9]{8}) *(\S*)", i)
for i in strings_to_test]
for match in digits_present:
print "{0:s} = {1:s} : {2:s} : {3:s}".format(match.group(0),
match.group(1), match.group(2), match.group(3))
返回:
01234567 = : 01234567 :
00000000 = : 00000000 :
special-word 01234567 = special-word : 01234567 :
special-word01234567 = special-word : 01234567 :
special-word01234567- = special-word : 01234567 : -
正如你所看到的,match.group(2)是你的数字集,你现在可以测试的不是全零。 match.group(1)和match.group(3)是数字两侧的文本,您可以检查列表中是否包含其中一个单词,包含或其他字符,以便排除。 最后,您需要检查外部匹配项是否都是列表中的单词以一个或两个零开头的单词。