我想要编写一个正则表达式,它匹配的字符串可能同时包含单词和数字,而不只包含数字.

我用了这个正则表达式[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.

使用这两种方法,您都不会考虑像-11.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

请注意,这是随机生成的文本,由于生成它的方法,字符串越长,它们就越不可能只由数字组成.最终,它将取决于实际的文本输入.

Python相关问答推荐

情节生成的饼图文本超出页面边界

如何计算部分聚合数据的统计数据

如何才能将每个组比上一组增加N %?

Python如何让代码在一个程序中工作而不在其他程序中工作

如何匹配3D圆柱体的轴和半径?

pyramid 内部数组中的连续序列-两极

用Python获取HTML Span类中的数据

基本链合同的地址是如何计算的?

无法使用python.h文件; Python嵌入错误

Python无法在已导入的目录中看到新模块

指示组内的rejected_time是否在creation_timestamp后5分钟内

在for循环中仅执行一次此操作

如何让 turtle 通过点击和拖动来绘制?

Polars:用氨纶的其他部分替换氨纶的部分

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何让这个星型模式在Python中只使用一个for循环?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

基于形状而非距离的两个numpy数组相似性

如何杀死一个进程,我的Python可执行文件以sudo启动?

无法在Spyder上的Pandas中将本地CSV转换为数据帧