如何根据每行的一部分按字母顺序对文本行进行排序?

How to sort lines of text alphabetically based on a part of each line?

我有一个包含如下缩写的文本文件(简化示例):

\item[3D] Three-dimensional
\item[PCA] Principal Component Analysis
\item[RF] Random Forest
\item[ANN] Artificial Neural Networks

我想在 R 中处理这些行,以便缩写词(例如 ANN)按字母顺序排序,并且以数字开头的缩写词(例如 3D)出现在最后一个以数字开头的缩写词之后与信。 \item[]s 应该被忽略并保持不变,因为它们将在 LaTeX 文件中使用。

我想要的输出是:

\item[ANN] Artificial Neural Networks
\item[PCA] Principal Component Analysis
\item[RF] Random Forest
\item[3D] Three-dimensional

我有兴趣使用 tidyverse 解决此问题,但任何其他解决方案也很有用。

这是一个“tidyverse”解决方案:

sorted_lines = readLines(your_file) %>%
    tibble(text = .) %>%
    extract(text, into = 'abbr', regex = r'(\item\[([^]]*)\])', remove = FALSE) %>%
    arrange(abbr) %>%
    pull(text)

结果:

\item[3D] Three-dimensional
\item[ANN] Artificial Neural Networks
\item[PCA] Principal Component Analysis
\item[RF] Random Forest

然而,这里真的没有必要使用整洁的数据操作。您可以等效地使用(主要是 1)基本 R 函数:

lines = readLines(your_file)
abbreviations = str_match(lines, r'(\item\[([^\]]*)\])')[, 2L]
sorted_lines = lines[order(abbreviations)]

请注意,这两种解决方案都会产生与您的问题不同的排序,因为它们会在“ANN”之前排序“3D”,和传统一样。您确定要在末尾输入数字吗?

在这两种情况下,代码都通过正则表达式r'(\item\[([^]]*)\])'从每一行文本中提取缩写,然后根据这些缩写对行进行排序。

正则表达式使用 R 4.0 的新 raw string literals: r"(…)"。这允许我们在字符串中使用反斜杠而不必转义它们。如果没有原始字符串文字,正则表达式将如下所示:\\item\[([^\]]*)\])。 — 这只是不必要地难以阅读。


1 我正在使用来自“stringr”的 str_match,因为 base R 中的模式提取函数使用起来很痛苦。