我想要编写一个正则表达式,它匹配的字符串可能同时包含单词和数字,而不只包含数字.
我用了这个正则表达式[A-z+\d*]
,但它不起作用.
一些匹配的样本:
expression123
123expression
exp123ression
不匹配的样本:
1235234567544
你能帮我做这件事吗?先谢谢你
我想要编写一个正则表达式,它匹配的字符串可能同时包含单词和数字,而不只包含数字.
我用了这个正则表达式[A-z+\d*]
,但它不起作用.
一些匹配的样本:
expression123
123expression
exp123ression
不匹配的样本:
1235234567544
你能帮我做这件事吗?先谢谢你
向四周看go 营救!
^(?!\d+$)\w+$
这使用了负向先行构造和锚定,请参见a demo on regex101.com
请注意,仅使用纯Python
代码可能会得到相同的结果:
samples = ["expression123", "123expression", "exp123ression", "1235234567544"]
filtered = [item for item in samples if not item.isdigit()]
print(filtered)
# ['expression123', '123expression', 'exp123ression']
请参见another demo on ideone.com.
使用这两种方法,您都不会考虑像-1
或1.0
这样的输入字符串(它们是允许的).
随着讨论的展开,下面是一个适用于不同样本大小和表达式的小型测试套件:
import string, random, re, timeit
class RegexTester():
samples = []
expressions_to_test = {"Cary": "^(?=.*\D)\w+$",
"Jan": "^(?!\d+$)\w+$"}
def __init__(self, sample_size=100, word_size=10, times=100):
self.sample_size = sample_size
self.word_size = word_size
self.times = times
# generate samples
self.samples = ["".join(random.choices(string.ascii_letters + string.digits, k=self.word_size))
for _ in range(self.sample_size)]
# compile the expressions in question
for key, expression in self.expressions_to_test.items():
self.expressions_to_test[key] = {"raw": expression, "compiled": re.compile(expression)}
def describe_sample(self):
only_digits = [item for item in self.samples if all(char.isdigit() for char in item)]
return only_digits
def test_expressions(self):
def regex_test(samples, expr):
return [expr.search(item) for item in samples]
for key, values in self.expressions_to_test.items():
t = timeit.Timer(lambda: regex_test(self.samples, values["compiled"]))
print("{key}, Times: {times}, Result: {result}".format(key=key,
times=self.times,
result=t.timeit(100)))
rt = RegexTester(sample_size=10 ** 5, word_size=10, times=10 ** 4)
#rt.describe_sample()
rt.test_expressions()
在样本大小为10^5的情况下,字长为10的两个表达式的结果具有可比性:
Cary, Times: 10000, Result: 6.1406331
Jan, Times: 10000, Result: 5.948537699999999
当您将样本大小设置为10^4,将字大小设置为10^3时,结果是相同的:
Cary, Times: 10000, Result: 10.1723557
Jan, Times: 10000, Result: 9.697761900000001
当字符串仅由数字组成时,您将得到significant个差异(也称为仅使用数字生成的样本):
Cary, Times: 10000, Result: 25.4842013
Jan, Times: 10000, Result: 17.3708319
请注意,这是随机生成的文本,由于生成它的方法,字符串越长,它们就越不可能只由数字组成.最终,它将取决于实际的文本输入.