Community
    • Login

    REGEX: Change the name in reverse order

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    6 Posts 3 Posters 156 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Neculai I. FantanaruN Offline
      Neculai I. Fantanaru
      last edited by Neculai I. Fantanaru

      The names are upside down, I want to change them in ascending order. They are from 152 to 162 in the name on the hdd, but actually it was a mistake, they should have the files in the reverse order. So after replace I will have 162 instead of 151 and so on.

      Example:

      masini-unelte-emil-botez-carte-p1_compress_Page_151.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_152.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_153.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_154.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_155.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_156.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_157.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_158.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_159.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_160.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_161.jpg
      masini-unelte-emil-botez-carte-p1_compress_Page_162.jpg
      

      So the basis would be this.
      FIND: masini-unelte-emil-botez-carte-p1_compress_Page_\d+(.*?)\.jpg

      from here I have to select all the names and change the part of \d+ i.e. the numbers, so that I can reverse them.

      Output must be: (162 ↔ 151; 161 ↔ 152; 160 ↔ 153...)

      I try this, but not very good:

      FInd: _Page_(15([1-9])|16([0-2]))\.jpg
      Replace: _Page_\2\3\1.jpg

      gerdb42G 1 Reply Last reply Reply Quote 0
      • gerdb42G Offline
        gerdb42 @Neculai I. Fantanaru
        last edited by

        So what is wrong with the sorting options from Edit->Line Operations? What are you trying to achieve that can’t be solved by them?

        Neculai I. FantanaruN 1 Reply Last reply Reply Quote 0
        • Neculai I. FantanaruN Offline
          Neculai I. Fantanaru @gerdb42
          last edited by Neculai I. Fantanaru

          @gerdb42

          I have over 2000 txt files, and I want to use regex. I already have a very good Python code. But I want regex. Maybe @guy038 knows a regex solution.

          import os
          import re
          
          FOLDER = r"g:\Colectia EMINESCIANA\tst"
          PATTERN = re.compile(r"^(.*_Page_)(\d+)(\.jpg)$", re.IGNORECASE)
          
          fisiere = []
          for nume in os.listdir(FOLDER):
              m = PATTERN.match(nume)
              if m and os.path.isfile(os.path.join(FOLDER, nume)):
                  fisiere.append((int(m.group(2)), nume, m.group(1), m.group(2), m.group(3)))
          
          if not fisiere:
              raise SystemExit("Nu s-a găsit niciun fișier care să corespundă tiparului.")
          
          fisiere.sort(key=lambda x: x[0])
          numere = [f[3] for f in fisiere]
          perechi = list(zip([f[1] for f in fisiere], numere[::-1]))
          
          print(f"Se inversează {len(perechi)} fișiere din {FOLDER}\n")
          for (vechi, nou_num), (_, _, prefix, _, ext) in zip(perechi, fisiere):
              print(f"  {vechi}  ->  {prefix}{nou_num}{ext}")
          
          if input("\nConfirmi redenumirea? (d/n): ").strip().lower() != "d":
              raise SystemExit("Anulat.")
          
          temporare = []
          for i, (vechi, _) in enumerate(perechi):
              tmp = f"__tmp_{i}__.jpg"
              os.rename(os.path.join(FOLDER, vechi), os.path.join(FOLDER, tmp))
              temporare.append(tmp)
          
          for tmp, ((_, nou_num), (_, _, prefix, _, ext)) in zip(temporare, zip(perechi, fisiere)):
              os.rename(os.path.join(FOLDER, tmp), os.path.join(FOLDER, f"{prefix}{nou_num}{ext}"))
          
          print("\nRedenumire finalizată cu succes!")
          
          PeterJonesP 1 Reply Last reply Reply Quote 0
          • PeterJonesP Online
            PeterJones @Neculai I. Fantanaru
            last edited by PeterJones

            @Neculai-I.-Fantanaru said:

            I already have a very good Python code. But I want regex.

            The Python code (or other programming language) is the right solution.

            Regex doesn’t work the way you want it to, and do if you’ve got more than one swap to do per file, regex will not solve your problem.

            Neculai I. FantanaruN 1 Reply Last reply Reply Quote 0
            • Neculai I. FantanaruN Offline
              Neculai I. Fantanaru @PeterJones
              last edited by

              @PeterJones

              Every problem hides a solution to another problem. So, I just discover some king of Incrementation with REGEX. Someone said you can’t get increment with regex, well, you can. Lucky me.

              So I have this:

              masini-unelte-emil-botez-carte-p1_compress_Page_151.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_152.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_153.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_154.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_155.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_156.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_157.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_158.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_159.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_160.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_161.jpg
              masini-unelte-emil-botez-carte-p1_compress_Page_162.jpg
              

              I use this regex:

              FIND: _Page_(15([1-9])|16([0-2]))\.jpg
              REPLACE BY: \3\2\1

              Output:

              masini-unelte-emil-botez-carte-p1_compress1151
              masini-unelte-emil-botez-carte-p1_compress2152
              masini-unelte-emil-botez-carte-p1_compress3153
              masini-unelte-emil-botez-carte-p1_compress4154
              masini-unelte-emil-botez-carte-p1_compress5155
              masini-unelte-emil-botez-carte-p1_compress6156
              masini-unelte-emil-botez-carte-p1_compress7157
              masini-unelte-emil-botez-carte-p1_compress8158
              masini-unelte-emil-botez-carte-p1_compress9159
              masini-unelte-emil-botez-carte-p1_compress0160
              masini-unelte-emil-botez-carte-p1_compress1161
              masini-unelte-emil-botez-carte-p1_compress2162
              

              Before each number at the end, I got another number in order. But I don’t know why I couldn’t get 10 or 11, and it started all over again from 1 to 0.

              Then I tested many variants, and found the fabulous solution to Incrementation with Regex:

              FIND: _Page_(15([1-9])|16([0-2]))\.jpg
              REPLACE: \2(?{3}1)\3\1

              I get this: 1 to 12 each line, in order"

              masini-unelte-emil-botez-carte-p1_compress1151
              masini-unelte-emil-botez-carte-p1_compress2152
              masini-unelte-emil-botez-carte-p1_compress3153
              masini-unelte-emil-botez-carte-p1_compress4154
              masini-unelte-emil-botez-carte-p1_compress5155
              masini-unelte-emil-botez-carte-p1_compress6156
              masini-unelte-emil-botez-carte-p1_compress7157
              masini-unelte-emil-botez-carte-p1_compress8158
              masini-unelte-emil-botez-carte-p1_compress9159
              masini-unelte-emil-botez-carte-p1_compress10160
              masini-unelte-emil-botez-carte-p1_compress11161
              masini-unelte-emil-botez-carte-p1_compress12162
              
              PeterJonesP 1 Reply Last reply Reply Quote 0
              • PeterJonesP Online
                PeterJones @Neculai I. Fantanaru
                last edited by PeterJones

                @Neculai-I.-Fantanaru ,

                It’s not your originally-stated request (ie, it does not put those exact numbers in reverse order), and it won’t work if your number range changes.

                But if it works for what you really want (rather than what you asked for), that’s great for you.

                Someone said you can’t get increment with regex, well, you can

                Not generically, you can’t.

                If you have a limited set of numbers, it’s really easy to do, as you found, by crafting regex cumbersome regex, but those get less viable the wider range of numbers you want – just try going from 101 - 199, for example; or, worse, from 101-9999 – . Guy has shown much wider ranges than your effort, but it will never be generic, as someone will always need “one more digit” than your regex provided.

                (update: I also don’t see how that’s “increment”, in any meaningful interpretation of the word: it doesn’t just “add X” to the original number; it just copies the last digit to before the first)


                Also: Per my reading of your original question, where I assumed “in reverse order” meant 162 ↔ 151; 161 ↔ 152; 160 ↔ 153 (like you said), rather than some weird rearrangement of the digits withing a given number (151→1151, 152→2152, …) (like I now see that I think your python did: I hadn’t bothered reading your python before, because I assumed it did what you said you wanted), I would now propose a different solution to what I thought you were asking for, given that you seem to only care about 151-162, and no other numbers: FIND = Page_(?:(151)|(152)|(153)|(154)|(155)|(156)|(157)|(158)|(159)|(160)|(161)|(162)) REPLACE = Page_(?{1}162)(?{2}161)(?{3}160)(?{4}159)(?{5}158)(?{6}157)(?{7}156)(?{8}155)(?{9}154)(?{10}153)(?{11}152)(?{12}151) – but since that’s not generic, it’s 99.9999% of the time not what someone would would want, if they phrased the question the way you did in your title and your mapping. I now don’t think this is actually what you wanted, based on your python and your pseudo-increment; but if it is what you originally wanted, feel free to use it.

                1 Reply Last reply Reply Quote 0

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                • First post
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors