我刚刚开始学习《代码2023的到来》,并试图用它来学习一些新的编程语言.我已经(有些)熟悉了Python,而且实际上我今天刚刚安装了Ruby.

第1天,第2部分,我使用正则表达式来搜索数字及其拼写版本.Python中的正则表达式(生成正确的结果): (?=(0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine))

当我在Ruby中使用这个正则表达式时,我得到的结果为零.有趣的是,当我使用这个正则表达式时,我在python和ruby中得到了完全相同的结果,但这是不正确的答案: r"0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine"

因此,我认为答案与积极的前瞻性断言有关,但我不知道为什么,以及它的做法有什么不同.

下面是这两个文件.

Python:

import re

input = open("../resources/input.txt","r")
lines = input.readlines()

targets = [
    '0','1','2','3','4','5','6','7','8','9',
    'zero','one','two','three','four','five','six','seven','eight','nine'
]
values = {
    '0': 0,
    '1': 1,
    '2': 2,
    '3': 3,
    '4': 4,
    '5': 5,
    '6': 6,
    '7': 7,
    '8': 8,
    '9': 9,
    'zero': 0,
    'one': 1,
    'two': 2,
    'three': 3,
    'four': 4,
    'five': 5,
    'six': 6,
    'seven': 7,
    'eight': 8,
    'nine': 9
}

sum = 0

for line in lines:
    numbers = re.findall(r"(?=("+'|'.join(targets)+r"))", line)

    firstDigitValue = values[numbers[0]] * 10
    lastDigitValue = values[numbers[-1]]

    sum += (firstDigitValue+lastDigitValue)



print(sum)

露比:

# Init vars
sum = 0

reg = /\d|zero|one|two|three|four|five|six|seven|eight|nine/
reg2 = /(?=(0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine))/
reg3 = /0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine/

values = {
    '0' => 0,
    '1' => 1,
    '2' => 2,
    '3' => 3,
    '4' => 4,
    '5' => 5,
    '6' => 6,
    '7' => 7,
    '8' => 8,
    '9' => 9,
    'zero' => 0,
    'one' => 1,
    'two' => 2,
    'three' => 3,
    'four' => 4,
    'five' => 5,
    'six' => 6,
    'seven' => 7,
    'eight' => 8,
    'nine' => 9
}


# Pipe the file line by line and do per line
File.foreach("../resources/input.txt", chomp: true) do |line|
    # Get the first and last digits as their values
    numbers = line.scan(reg3)

    firstDigitValue = values[numbers[0]] * 10
    lastDigitValue = values[numbers[-1]]

    # accumulate
    sum += (firstDigitValue+lastDigitValue)

end

puts sum

推荐答案

0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine

在Python和Ruby中,这个正则表达式的问题是您没有考虑到重叠匹配.本月早些时候,我在做这道题时犯了完全相同的错误.例如,如果短语eightwo出现在您的拼图输入中,那么Python和Ruby都将匹配"8"部分,然后start将在"w"处查找更多匹配,因此它们不会看到单词"2".

(?=(0|1|2|3|4|5|6|7|8|9|zero|one|two|three|four|five|six|seven|eight|nine))

这通过将整个比赛提前进行纠正了这个问题(这可能效率不高,但我们正在进行编码挑战,所以它已经足够好了).在考虑重叠时,LookaHead不被认为是模式的一部分,所以我们基本上就从我们停止的地方开始搜索.

然而,在Ruby中,当您的正则表达式中有捕获组时,String#scan的行为就不同了.

如果模式包含组,则每个单独的结果本身就是一个数组,每个组包含一个条目.

所以你的输出实际上看起来像

[["4"], ["one"], ["eight"], ["nine"]]

您只需要处理这个额外的嵌套层.

first_digit_value = values[numbers[0][0]] * 10
last_digit_value = values[numbers[-1][0]]

Python相关问答推荐

Flask主机持续 bootstrap 本地IP| Python

Plotly:如何更改Heatmap中彩色条的勾选文本

DuckDB将蜂巢分区插入拼花文件

在上下文管理器中更改异常类型

Polars:使用列值引用when / then表达中的其他列

Pydantic 2.7.0模型接受字符串日期时间或无

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

_repr_html_实现自定义__getattr_时未显示

将两只Pandas rame乘以指数

如何记录脚本输出

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

索引到 torch 张量,沿轴具有可变长度索引

无法连接到Keycloat服务器

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

try 检索blob名称列表时出现错误填充错误""

以逻辑方式获取自己的pyproject.toml依赖项

导入错误:无法导入名称';操作';

基于Scipy插值法的三次样条系数

Polars Group by描述扩展

如何根据rame中的列值分别分组值