正则表达式,如果数字字符串包含特定数字

时间:2014-06-01 23:41:56

标签: regex

我需要一些创建正则表达式字符串的帮助。我有这么长的数字列表:

  

7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014   7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028   7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042   7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056   7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070   7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084   7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098   7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112   7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126   7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140   7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154   7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168   7169 7170 7171 7172 7173 7174 7175 7176 7177

基本上,我需要找到包含数字8和9的数字,以便我可以从列表中删除它们。

我试过这个正则表达式:([0-7][0-7][8-9]{2})但是这只会匹配严格同时具有数字8和数字的数字。 9。

7 个答案:

答案 0 :(得分:4)

你怎么写一些简单的代码,而不是试图把所有东西塞进正则表达式?

#!/usr/bin/perl -i -p      # Process the file in place

@n = split / /;            # Split on whitespace into array @n
@n = grep { !/[89]/ } @n;  # @n now contains only those numbers NOT containing 8 or 9
$_ = join( ' ', @n );      # Rebuild the line

答案 1 :(得分:1)

Dalorzo 答案可行,但我建议采用不同的方法:

/\b(?=\d{4}\b)(\d*[89]\d*)\b/g

假设您只是在寻找4位数字,那么它正在使用正向前瞻以确保您拥有这些数字(因此它将不匹配,例如3或5位数字),然后检查是否至少有一个数字是8或9。

http://regex101.com/r/hW4vQ3

如果您需要捕获所有数字,而不仅仅是四位数,那么

/\b(?=\d+\b)(\d*[89]\d*)\b/g

看到它的实际效果:

http://regex101.com/r/bW2gH3

作为奖励,正则表达式也会捕获数字,以便您可以在事后进行替换,如果您愿意的话

答案 2 :(得分:0)

怎么样:

/\b((?:[\d]+)?[89](?:[\d]+)?)\b/g

<强> Online Demo

  • \b 会匹配每个号码的结尾和乞讨。
  • (?:[\d]+)? 一组不匹配的数字,我们需要在乞讨[89]和结尾[89]并且包含[89]时可选。
  • ?: 此匹配组中的非匹配组可能是可选的,但不需要匹配子组。

答案 3 :(得分:0)

这有点啰嗦,但更容易破译:

/\b([89]\d{3}|\d[89]\d{2}|\d{2}[89]\d|\d{3}[89])\b/g

它还将搜索限制为4​​位数组。

答案 4 :(得分:0)

您可以使用此模式:

[0-7]*(?:8[0-8]*9|9[0-9]*8)[0-9]*

或使用反向引用:

(?:[0-9]*(?!\1)([89])){2}[0-9]*

答案 5 :(得分:0)

re.findall(r"(\d\d[0-7][89])|(\d\d[89][0-7])|(\d\d[89][89])",x)

适用于给定的输入。

答案 6 :(得分:0)

稍微简单的正则表达式与前瞻:

(?=\d*[89])\d+

Regular expression visualization

<强> Demo