如何从一大批字符串中提取特定部分?

如何从一大批字符串中提取特定部分?

例如。

64d134a354eb2bf43626a73091514a2d:QMP0R\khOiPmkW1>bP,_-NTY4%-!P#:a123456
7d057d46b88f2cf4845dec57be4f3158:iR+LE[SQ\R~~o*+CCNL?i)mC>$G:U#:123321
6e0c116855a273f0c8c41dec1d21c160:s'?:fL2/mVj{&[`Onkyqf"y~47^YU#:abc123

所有字符串都遵循三部分模式。前两部分各用冒号分隔,第二个冒号后面是所需元素。

例外:在字符串的第二部分,也存在偶尔的冒号。(参见以“abc123”结尾的第三行)

我的建议是反转所有字符串,完成后,删除第一个冒号之后的所有字符(包括第一个冒号)。完成后,再次反转文本,得到所需的元素,如下所示:

a123456
123321
abc123

注意:这将应用于大批量的此类字符串!

答案1

在 Notepad++ 中,您可以使用其“查找和替换”功能删除第三个段之前的所有内容。

只需使用此查找,并打开正则表达式单选按钮:

^.*:(?!.*:)

并将其替换为无,然后点击全部替换。

在此处输入图片描述

这个表达式的意思是:

^       Ensure match begins at the start of the line
.*      Match any number of characters
:       Until it matches a colon (:)
(?!     And ensure that after the colon, there are no...
  .*:   Colon after any number of characters on the same line
)

结果:

在此处输入图片描述


如果第三部分也可以包含冒号,但#:与其他部分相比它总是以 开头,那么您可以使用略有不同的表达式来查找:

^.*#:

并且用空值代替。

答案2

有几种方法可以做到这一点。

最简单的方法可能是在 Sublime 文本编辑器中加载文件,然后在要保留的第一个文本(a123456)的开头按住 ctrl + 鼠标中键单击,然后将鼠标中键向下拖动到文档的右下角。您应该已经突出显示了所有想要的文本。然后按住 ctrl + c、ctrl + v 进入新文件。这是假设所有行都有所需的文本从同一位置开始,就像您示例中的第 67 列一样。

如果没有,请在 Sublime 中加载文件,按 ctrl + f,然后单击.*底部的查找工具栏中的按钮。搜索

#:(.*)

点击右侧的“查找全部”,然后将其复制并粘贴到新文档中。Ctrl + f 再次查找,搜索

^..

再次查找所有内容,然后删除。这样你就只剩下最后的字符串了(a123456、123321、abc123)

它是如何工作的?.*按钮搜索正则表达式,或 Regex。Regex 定义匹配文本模式的规则。这里的规则非常简单:查找以 开头的文本#:并抓取其后的所有内容。您可能只需一步就可以完成,但我对 Regex 的使用还不是很熟练。所以我们要做的是搜索#:,然后搜索任意数量*的 ( ) 任意字符 ( .)。然后我们将其复制到一个新文件中。

然后,我们匹配开头(^)两个字符(..)并简单地删除它们以剩下我们想要的文本。

我建议你使用 Sublime 文本编辑器,因为它免费、快速,并且它的搜索功能让你可以非常轻松地选择不连贯的文本组并将其复制粘贴到其他地方。Notepad++ 也可以做到这一点,但它的正则表达式功能会添加一堆垃圾文本,指示它在哪里找到匹配项,这当然是你不想要的。

答案3

我要做的是将所有字符串导入到 Excel 或其他电子表格程序中。使用冒号作为列分隔符,所有元素都应该放在表的第 3 列中。

大多数数据会位于第三列,部分数据会位于第四列,并且数据中可能存在许多冒号,因此我会在开始处插入一列,查看整行并找到最后一个包含数据的单元格并将其放在第一列。

我在 Excel 2010 中测试过类似以下公式:

=如果(ISBLANK(D1),C1,如果(ISBLANK(E1),D1,如果(ISBLANK(F1),E1,F1)))

将查看 C、D 和 E 行,并将最后一列的值放入带有公式的单元格中。

此公式仅考虑 3 列,可以无限修改

如果您使用向下填充来填充该列,您应该会在 A 列中获得您正在寻找的答案。

答案4

您使用具有正则表达式搜索和替换功能的文本编辑器。您的搜索词应该是:

.*:(.*)

替换为:

\1

我使用了 Sublime Text,但 notepad2/Notepad++ 也可以使用。

正则表达式解释:

.* - Matches any number of characters
:  - Match a colon
(.*) - Match any number of character as a subgroup

然后,将\1整个匹配的行替换为子组的内容(您想要的文本)。默认情况下,正则表达式是贪婪的(在大多数实现中),并将匹配最长的字符串。这意味着此正则表达式将匹配正则表达式的第二部分(冒号后跟任意数量的字符)之前的尽可能多的字符。

相关内容