0

pyperclip.paste()如果搜索表达式涉及\n换行符,则在尝试使用 regex 槽 a 进行搜索时,这对我来说是一件罕见的事情。

原谅我的英语。

搜索时,我通过分配给text变量的这个三引号进行搜索:

import re

text = '''
This as the line 1
This as the line 2
'''

pattern = re.compile(r'\d\n\w+')
result = pattern.findall(text)
print(result)

它实际上打印了换行符\n。这就是我想要的,或者几乎是我所期望的。

»»» ['1\n这个']

但是,当要搜索的字符串来自从剪贴板复制的文本时,问题就开始了。

This as the line 1
This as the line 2

假设我只是选择该文本并将其复制到剪贴板,并且我希望正则表达式从中提取相同的先前输出。这次我需要使用 pyperclip 模块。

所以,忘记前面的代码,改写这个:

import re, pyperclip

text = pyperclip.paste()

pattern = re.compile(r'\d\n\w+')
result = pattern.findall(text)
print(result)

这是结果:

»»» [ ]

什么都没有,只有两个括号。我发现(以我的经验不足)导致此问题的问题是\n角色。它与python(也是\n字符)之间的冲突无关,因为我们用'r'避免了这种情况。

我已经找到了一个不太清楚的解决方案(对我来说几乎,因为我现在只是了解python的基础知识)。

import re, pyperclip

text = pyperclip.paste()
lines = text.split('\n')
spam = ''

for i in lines:
    spam = spam + i

pattern = re.compile(r'\d\r\w+')
result = pattern.findall(spam)
print(result)

请注意,我没有选择在最后一个正则表达式中\n检测新行\r,而是选择(\n将导致相同的不良行为仅打印括号)。 \r它可与 交换\s,输出有效,但是:

»»» ['1\rThis']

\r而不是\n

至少这对我来说是一个小小的胜利。

如果您能向我解释一个更好的解决方案,这将对我有很大帮助,或者几乎理解为什么会发生这种情况。您还可以推荐一些要调查的概念,以充分理解这一点。

4

1 回答 1

0

粘贴时出现的原因\r是因为您是从 Windows 机器粘贴的。在 Windows 上,换行符由 . 表示\r\n。请注意,\s与 不同\r\s表示任何空白字符。\r只是回车符。

文本:

This as the line 1 This as the line 2

实际上看起来像:

This as the line 1\r\n This as the line 2\r\n

在 Windows 机器上。

在正则表达式中,\d\r匹配到第一行的结尾: 1\r但随后\w+不匹配\n. 您需要将您的第一个正则表达式编辑为:

pattern = re.compile(r'\d\r\n\w+')

资料来源:Windows 和 Linux 的行尾不同吗?

于 2018-09-24T20:50:52.483 回答