Sublime Text3 或 Excel VBS 实现去除首尾内容单独提取 danbooru 提示词

/ 407 阅读 / 0

danbooru.donmai.us 不多说了吧,DDDD。

AICG 的时候 danbooru 上图片的 prompt 总是这种样式的? black thighhighs 213k,整理提示词就很繁琐。老样子分享两个个技巧:

例如:

? 1girl 4.4M
? ass 447k
? black ribbon 88k
? black shorts 64k
? black thighhighs 213k
? breasts 2.5M

上面的内容来自 danbooru 大图提示词,接下来:

Sublime Text3 方式

  1. 打开 Sublime Text
  2. 将需要提示词文本复制过来
  3. 按下 Ctrl+H,打开搜索功能。
  4. 勾选左侧的.*正则表达式(regular expression)。
  5. 在 Find 栏中输入正则表达式^[^\w]+|\s\b\d+(\.\d+)?[kKM]$|[^-\w]+$
  6. 点击 Replace All 即可。

干净的提示词就提取出来了。


^[^\w]+|\s\b\d+(\.\d+)?[kKM]$|[^-\w]+$

正则表达式包含了三个部分,使用了 | 符号将它们组合在一起,表示匹配任意一个部分。

  1. ^[^\w]+:以一个或多个非单词字符开头,用来匹配行首非单词字符,^ 表示行首,[^\w]+ 表示匹配一个或多个非单词字符,[] 表示字符集。
  2. |\s\b\d+(\.\d+)?[kKM]$:匹配包含一个数字、一个空白字符和一个单位符号(k、K、M)的字符串,用来匹配数字加单位,| 表示或者,\s 表示匹配任意空白字符,\b 表示匹配一个单词边界,\d+ 表示匹配一个或多个数字字符,(\.\d+)? 表示匹配小数部分(可选),[kKM]$ 表示匹配单位符号(k、K、M)和行尾。
  3. |[^-\w]+$:以一个或多个非单词字符结尾,用来匹配行尾非单词字符,[^-\w]+ 表示匹配一个或多个非单词字符(不包括横线 -),$ 表示行尾。

综合起来,这个正则表达式可以匹配以下三种类型的字符串:

  1. 以一个或多个非单词字符开头的字符串。
  2. 包含一个数字、一个空白字符和一个单位符号(k、K、M)的字符串。
  3. 以一个或多个非单词字符结尾的字符串。

例如,下面的字符串都可以被匹配到:

请注意,在实际使用中,这个正则表达式可能需要根据具体的需求进行调整和修改,以便更好地匹配目标字符串。


如果你的提示词是逗号链接的,可以看看这篇《方便整理 AICG 提示词,正则表达式去除提示词逗号及空格

Excel 方式

另外,如果你觉得使用 Sublime Text3 比较麻烦,你可以使用 excel 的 VBS 功能实现相同功能,具体步骤如下:

  1. 打开 Excel,并选择包含需要分离的文本的单元格。
  2. 按下 Alt + F11 打开 Visual Basic Editor 窗口。
  3. 在菜单栏中,选择 “插入” -> “模块”,以创建一个新的模块。
  4. 将代码复制并粘贴到模块中。
  5. 返回 Excel 窗口,并选择需要分离文本的单元格。
  6. 按下 Alt + F8 打开 “宏” 对话框。
  7. 选择 “Danbooru 提示词提取” 宏,并单击 “运行” 按钮。

具体 VBS 代码如下:

Sub Danbooru 提示词提取 ()
    Dim regEx As Object
    Dim strPattern As String
    Dim strInput As String
    Dim strOutput As String
    Dim MyRange As Range
    Dim i As Long
    
    ' 设置正则表达式模式
    Set regEx = CreateObject("VBScript.RegExp")
    strPattern = "^[^\w]*|[^\w]*(\d+[.]?\d*)[kKmM]$"
    
    ' 应用正则表达式到每个单元格
    Set MyRange = ActiveSheet.Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
    For Each cell In MyRange
        If Not IsEmpty(cell) Then
            strInput = cell.Value
            ' 使用正则表达式替换首尾内容为空字符串
            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With
            
            strOutput = regEx.Replace(strInput, "")
            
            ' 将结果输出到 B 列
            i = i + 1
            Range("B" & i).Value = strOutput
        End If
    Next cell
End Sub