ข้ามไปเนื้อหา

คู่มือการใช้ไพวิกิพีเดีย/ใช้งาน replace.py

จาก วิกิตำรา
« คู่มือการใช้ไพวิกิพีเดีย
ใช้งาน replace.py
»
พื้นฐานการใช้งานสคริปต์ ใช้งาน login.py


replace.py เป็นสคริปต์ที่ใช้ในการแทนที่ข้อความ ซึ่งอาจหมายถึงการลบข้อความ (แทนที่ข้อความที่จะลบให้เป็นข้อความว่าง) หรือการเพิ่มข้อความด้วย

จากการที่ replace.py รองรับการใช้นิพจน์ปรกติ จึงทำให้มีความยืดหยุ่นในการใช้งานมาก แต่ถึงแม้จะไม่มีความรู้ด้านนิพจน์ปรกติก็สามารถใช้สคริปต์นี้อย่างง่ายได้เช่นกัน

แนะนำภาพรวม

[แก้ไข | แก้ไขต้นฉบับ]
python replace.py -cat:ขั้นตอนวิธี "อัลกอริทึม" "ขั้นตอนวิธี"

มีพารามิเตอร์และความหมายดังนี้

ลำดับที่ พารามิเตอร์ ความหมาย
1 -cat:ขั้นตอนวิธี แปลว่าให้ทำงานกับทุก ๆ หน้าที่อยู่ใน หมวดหมู่:ขั้นตอนวิธี
2 "อัลกอริทึม" เป็นอัญประกาศอันแรก แสดงถึงข้อความที่จะค้นหา ซึ่งก็คือคำว่า อัลกอริทึม นั่นเอง
3 "ขั้นตอนวิธี" เป็นอัญประกาศอันที่สอง แสดงถึงข้อความที่จะแทนที่ ซึ่งก็คือคำว่า ขั้นตอนวิธี นั่นเอง

ดังนั้นสมมุติหน้า ขั้นตอนวิธีการประมาณ อยู่ใน หมวดหมู่:ขั้นตอนวิธี และมีเนื้อหาดังนี้

... ดังนั้นอัลกอริทึมการประมาณจึงเป็นที่นิยมเป็นอย่างมากในการหาคำตอบแทนที่อัลกอริทึมอื่น ๆ ...

เนื้อหาก็จะเปลี่ยนไปเป็น

... ดังนั้นขั้นตอนวิธีการประมาณจึงเป็นที่นิยมเป็นอย่างมากในการหาคำตอบแทนที่ขั้นตอนวิธีอื่น ๆ ...

พารามิเตอร์

[แก้ไข | แก้ไขต้นฉบับ]

พารามิเตอร์สคริปต์

[แก้ไข | แก้ไขต้นฉบับ]
ข้อความที่จะค้นหาและข้อความที่จะแทนที่
ข้อความที่จะค้นหา จะเป็นข้อความในอัญประกาศ ("...") อันดับคี่ทั้งหมด ซึ่งจะจับคู่กันแบบหนึ่งต่อหนึ่งกับข้อความในอัญประกาศอันดับคู่ ซึ่งเป็นข้อความแทนที่

เช่น python replace.py "abc" "def" "ghi" "jkl" พารามิเตอร์อื่น แปลว่าให้เปลี่ยน "abc" → "def" และเปลี่ยน "ghi" → "jkl"

ทั้งนี้หากข้อความค้นหาใดไม่ปรากฎในหน้านั้น การแทนที่ของข้อความเฉพาะชุดนั้นก็จะไม่เกิดขึ้น

หน้าที่จะดำเนินการ
-page คือการระบุว่าให้มีการแทนที่ในหน้า pagename เมื่อมีการเรียกใช้ -page:pagename ทั้งนี้พารามิเตอร์ -page อาจเรียกใช้หลายครั้งก็ได้

เช่น python replace.py "abc" "xyz" -page:x -page:y -page:z จะเป็นการแทนที่ "abc" → "xyz" ในหน้า x y และ z

-ref คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่ลิงก์ (รวมถึงการ transclude / รวม) มายังหน้า pagename เมื่อมีการเรียกใช้ -ref:pagename
-links คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่ลิงก์จากหน้า pagename เมื่อมีการเรียกใช้ -links:pagename
-cat คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่อยู่ในหมวดหมู่ catname เมื่อมีการเรียกใช้ -cat:catname
-catr คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่อยู่ในหมวดหมู่ catname และหน้าที่อยู่ในหมวดหมู่ของหมวดหมู่ catname และหน้าที่อยู่ในหมวดหมู่ของหมวดหมู่ของหมวดหมู่ catname ... ไปเรื่อย ๆ เมื่อมีการเรียกใช้ -catr:catname
-subcats คือการระบุว่าให้มีการแทนที่ในทุก ๆ หมวดหมู่ที่อยู่ในหมวดหมู่ catname เมื่อมีการเรียกใช้ -subcats:catname
-subcatsr คือการระบุว่าให้มีการแทนที่ในทุก ๆ หมวดหมู่ที่อยู่ในหมวดหมู่ catname และหมวดหมู่ที่อยู่ในหมวดหมู่ของหมวดหมู่ catname และหมวดหมู่ที่อยู่ในหมวดหมู่ของหมวดหมู่ของหมวดหมู่ catname ... ไปเรื่อย ๆ เมื่อมีการเรียกใช้ -subcatsr:catname
-start คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าในวิกิพีเดียเป็นต้นไปนับจากหน้า pagename (ตามลำดับตัวอักษร) เมื่อมีการระบุ -start:pagename

เช่น python replace.py "abc" "xyz" -start:oak จะเป็นการแทนที่ "abc" → "xyz" ในหน้าที่มีลำดับพจนานุกรมมากกว่าหรือเท่ากับ oak เช่น oak, oak1, oaka, oakaaaa, p, , ฮฮฮ แต่ทั้งนี้จะไม่รวมหน้าทั้งหลายที่ลำดับพจนานุกรมน้อยกว่า oak เช่น a, oaj เป็นต้น

ดังนั้นหากต้องการให้ดำเนินการกับทุก ๆ หน้าในวิกิพีเดีย อาจใช้อักขระที่มีลำดับพจนานุกรมน้อยที่สุด นั่นคือเครื่องหมาย ! ในการระบุ เช่น python replace.py "abc" "xyz" -start:! เป็นต้น

อย่างไรก็ตาม มีคำแนะนำว่าหากต้องการดำเนินการกับทุก ๆ หน้า ควรใช้ xml local dump แทนที่การใช้ -start:![1] หรือก็หมายความว่าควรจะใช้ xml local dump เสมอ ยกเว้นในกรณีที่ไม่สามารถใช้ได้ จึงค่อยใช้ -start:! ทดแทน

-transcludes คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่มีการ transclude / รวม แม่แบบ templatename เมื่อมีการเรียกใช้ -transcludes:templatename
-filelinks คือการระบุว่าให้มีการแทนที่ในทุก ๆ หน้าที่มีการใช้รูป filename เมื่อมีการเรียกใช้ -filelinks:filename
...
ตัวเลือกของการแทนที่
-recursive ดำเนินการแทนที่ข้อความซ้ำไปเรื่อย ๆ เท่าที่เป็นไปได้ เช่น สำหรับข้อความ "ooakk" หากสั่งให้แทนที่ "oak" → "a" จะทำให้เกิด "a" เพียงตัวเดียว เพราะครั้งแรกจะมีการเปลี่ยน "ooakk" → "oak" จากนั้นก็เปลี่ยน "oak" → "a"
-allowoverlap คล้าย ๆ กับ -recursive แต่การตรวจหาข้อความซ้ำอีกรอบจะไม่ได้เริ่มต้นใหม่หมด แต่จะเริ่มจากจุดที่เพิ่งมีการแทนที่ เช่น จากตัวอย่างเดืม มีข้อความ "ooakk" และให้เปลี่ยนจาก "oak" → "a" จะเกิด การเปลี่ยน "ooakk" → "oak" จากนั้นก็เริ่มการแทนที่ต่อจากจุดเดิม (อักขระ 'o' ตัวที่ 2 ในข้อความเดืม หรืออักขระ 'a' ในข้อความใหม่) ซึ่งถัดจากอักขระตัวที่ 2 นั้น (คือ 3 เป็นต้นไป) ไม่มีข้อความที่แทนที่ได้อีก จึงได้ "oak" เป็นผลลัพธ์

แต่หากมี "aabbb" และแทนที่จาก "ab" → "aa" ครั้งแรกจะเกิดการแทนที่ "aabbb" → "aaabb" จากนั้นก็ดำเนินการต่อจากอักขระตัวที่ 2 ก็มีการแทนที่ "aaabb" → "aaaab" จากนั้นก็ "aaaab" → "aaaaa" จึงได้ "aaaaa" เป็นผลลัพธ์

-nocase การหาข้อความค้นหาจะไม่สนใจความแตกต่างของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของภาษาอังกฤษ ตัวเลือกนี้มีผลไปถึง นิพจน์ปรกติ (ดูเพิ่มด้านล่าง)
-regex การใช้พารามิเตอร์นี้ต้องมีความรู้เกี่ยวกับนิพจน์ปรกติ หากต้องการศึกษา โปรดอ่านเพิ่มเติมที่ตำรานิพจน์ปรกติ

ตัวเลือกนี้เมื่อใส่แล้วจะทำให้ string ของข้อความค้นหา (ข้อความอันดับคี่) ถูกตีความเป็น นิพจน์ปรกติ

เช่น อยากจะแทนที่คำว่า ด็อตเน็ต, ด็อตเน็ท, ด็อตเนต, ด็อตเนท, ด็อทเน็ต, ด็อทเน็ท, ด็อทเนต, ด็อทเนท, ดอตเน็ต, ดอตเน็ท, ดอตเนต, ดอตเนท, ดอทเน็ต, ดอทเน็ท, ดอทเนต, ดอทเนท → ดอตเน็ต ก็อาจจะใช้คำสั่ง python replace.py -regex -page:x "ด็?อ[ตท]เน็?[ตท]" "ดอตเน็ต" ได้

นิพจน์ปรกติของไพวิกิพีเดียจะคล้ายคลึงกับนิพจน์ปรกติของภาษาไพทอนเป็นอย่างมาก แต่อาจแตกต่างกันในบางประเด็น โปรดอ่านที่ภาพผนวกนิพจน์ปรกติในไพวิกิพีเดีย

-dotall เป็นตัวเลือกที่ให้ใช้คู่กับ -regex โดยมีความหมายว่า . (จุด) ใน นิพจน์ปรกติ จะ match กับทุก ๆ อักขระ รวมถึงอักขระขึ้นบรรทัดใหม่ด้วย (\n)

ไฟล์ที่เกี่ยวข้อง

[แก้ไข | แก้ไขต้นฉบับ]

ลบการเรียกใช้แม่แบบออกให้หมด

[แก้ไข | แก้ไขต้นฉบับ]

แนวคิดของการลบการเรียกใช้แม่แบบก็คือพยายามหาคู่ของ {{ กับ }} และลบข้อความที่อยู่ตรงกลางทิ้งเสีย ซึ่งทำได้โดยใช้นิพจน์ปรกติ (-regex) อย่างไรก็ตาม วิธีนี้มีปัญหาเพราะแม่แบบอาจมีการใช้ซ้อนกันก็ได้ เช่น {{a|b{{c}}d}} ซึ่งถ้าหากใช้นิพจน์ปรกติเพียงอย่างเดียวจะให้ผลลัพธ์ผิดพลาด จากตัวอย่างที่ยกมาก็อาจจะเกิดกรณีตัดเพียง {{a|b{{c}} จาก {{a|b{{c}}d}} ก็เป็นได้

วิธีการที่ดีกว่านั้นก็คือ พยายามหาคู่ของปีกกาที่ไม่มีการเรียกไม่แบบอยู่ข้างใน และตัดทิ้ง และทำเช่นนี้ไปเรื่อย ๆ จนกว่าจะไม่มีอะไรเปลี่ยนแปลงอีก ซึ่งก็สามารถกระทำได้โดยใช้นิพจน์ปรกติ (-regex) ร่วมกับ การทำซ้ำ (-recursive)

ตัวอย่างคำสั่งที่ใช้ก็คือ python replace.py -regex -recursive -dotall "\{\{(?:(?!\{\{|\}\}).)*\}\}" "" -page:x

ลำดับที่ นิพจน์ปรกติ คำอธิบาย
1 \{\{ หา {{
2 (?: เริ่ม non-capturing group
3 (?! เริ่ม negative lookahead
4 \{\{|\}\} หากมี {{ หรือ }} ให้ล้มเหลว
5 ) จบ negative lookahead
6 . จับกับอักขระ 1 ตัว หมายเหตุ: ใช้ -dotall เพื่อให้จับกับ \n ด้วย
7 )* จบ non-capturing group และให้ดำเนินการซ้ำไปเรื่อย ๆ
2 - 7 กล่าวคือหลังจับกับ {{ ในขั้นตอนที่ 1 แล้ว ให้จับอักขระไปเรื่อย ๆ ยกเว้นถ้าเจอ {{ หรือ }} ให้เลิกการจับต่อ
8 \}\} จับกับ }}